Erstellen eines HTTPS-Dienstes
Frage:
Wie kann Workerman einen https Dienst erstellen, damit Clients über https eine Verbindung herstellen können?
Antwort:
Das https Protokoll ist tatsächlich http + SSL, was bedeutet, dass die SSL Schicht über das http Protokoll gelegt wird. Workerman unterstützt das http Protokoll und auch SSL (Benötigt Workerman Version >= 3.3.7), daher muss nur die SSL Unterstützung aktiviert werden, um das https Protokoll zu unterstützen.
Es gibt zwei allgemeine Möglichkeiten, um Workerman HTTPS zu unterstützen: Eine Möglichkeit besteht darin, dass Workerman direkt SSL aktiviert, die andere besteht darin, nginx als SSL Proxy zu verwenden. Wählen Sie eine dieser beiden Optionen; sie können nicht gleichzeitig eingestellt werden.
Workerman aktiviert SSL
Vorbereitungen:
-
Workerman Version >= 3.3.7
-
PHP hat die OpenSSL-Erweiterung installiert
-
Ein Zertifikat wurde beantragt (pem/crt-Datei und key-Datei) und in /etc/nginx/conf.d/ssl abgelegt
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// Das Zertifikat sollte idealerweise ein beantragtes Zertifikat sein
$context = array(
'ssl' => array(
'local_cert' => '/etc/nginx/conf.d/ssl/server.pem', // kann auch eine crt-Datei sein
'local_pk' => '/etc/nginx/conf.d/ssl/server.key',
'verify_peer' => false,
'allow_self_signed' => true, // diese Option muss aktiviert werden, wenn es sich um ein selbstsigniertes Zertifikat handelt
)
);
// Hier ist das http-Protokoll eingestellt
$worker = new Worker('http://0.0.0.0:443', $context);
// Setze den Transport auf SSL, um http+SSL d.h. https zu aktivieren
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
$con->send('ok');
};
Worker::runAll();
Mit dem obigen Code von Workerman wurde ein HTTPS-Dienst erstellt, sodass Clients über das HTTPS-Protokoll eine Verbindung zu Workerman herstellen können, um sichere, verschlüsselte Kommunikation zu ermöglichen.
Test:
Geben Sie in die Adresszeile des Browsers https://域名:443 ein.
Hinweise:
-
Der HTTPS-Port muss über das HTTPS-Protokoll aufgerufen werden, der Zugriff über das HTTP-Protokoll ist nicht möglich.
-
Zertifikate sind in der Regel an einen Domainnamen gebunden, nutzen Sie daher zur Testung den Domainnamen und nicht die IP.
-
Wenn der Zugriff über HTTPS nicht möglich ist, überprüfen Sie die Firewall des Servers.
Verwendung von nginx als SSL-Proxy
Neben der Verwendung der eigenen SSL-Funktionen von Workerman kann auch nginx als SSL-Proxy zur Realisierung von HTTPS verwendet werden.
Hinweis
Entweder nginx als SSL-Proxy verwenden oder SSL in Workerman aktivieren, beides kann nicht gleichzeitig aktiviert werden.
Der Kommunikationsprozess und der Ablauf sind wie folgt:
-
Der Client initiiert eine HTTPS-Verbindung zu nginx
-
Nginx konvertiert die HTTPS-Daten in HTTP und leitet sie an den HTTP-Port von Workerman weiter
-
Workerman verarbeitet die Daten nach der Geschäftslogik und gibt die HTTP-Daten an nginx zurück
-
Nginx konvertiert die HTTP-Daten wieder in HTTPS und leitet sie an den Client weiter
nginx Konfigurationsbeispiel
Vorbedingungen und Vorbereitungen:
-
Angenommen, Workerman hört auf dem Port 8181 (HTTP-Protokoll)
-
Ein Zertifikat wurde beantragt (pem/crt-Datei und key-Datei) und in /etc/nginx/conf.d/ssl abgelegt
-
Es wird geplant, nginx den Port 443 für WSS-Proxy-Dienste bereitzustellen (der Port kann nach Bedarf geändert werden)
nginx-Konfiguration könnte folgendermaßen aussehen:
upstream workerman {
server 127.0.0.1:8181;
keepalive 10240;
}
server {
listen 443;
server_name 站点域名.com;
access_log off;
ssl on;
ssl_certificate /etc/nginx/conf.d/ssl/server.pem;
ssl_certificate_key /etc/nginx/conf.d/ssl/server.key;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:50m;
ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
location /
{
proxy_pass http://workerman;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Connection "";
}
}