Creare un servizio https
Domanda:
Come posso creare un servizio https con Workerman, in modo che i client possano comunicare tramite il protocollo https?
Risposta:
Il protocollo https è essenzialmente costituito da http + SSL, ovvero si sovrappone allo strato http aggiungendo SSL. Workerman supporta sia il protocollo http che SSL (necessario Workerman versione >=3.3.7), quindi è sufficiente abilitare SSL sopra il protocollo http per supportare il protocollo https.
Ci sono due modi comuni per abilitare https con Workerman, uno è abilitare direttamente SSL con Workerman, l'altro è utilizzare nginx come proxy SSL. Si può scegliere uno dei due metodi, non entrambi contemporaneamente.
Abilitare SSL con Workerman
Preparazione:
-
Versione di Workerman >=3.3.7
-
PHP con estensione openssl installata
-
Certificato (file pem/crt e chiave) già ottenuti e posizionati in /etc/nginx/conf.d/ssl
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// Si consiglia di ottenere un certificato valido
$context = array(
'ssl' => array(
'local_cert' => '/etc/nginx/conf.d/ssl/server.pem', // può anche essere un file crt
'local_pk' => '/etc/nginx/conf.d/ssl/server.key',
'verify_peer' => false,
'allow_self_signed' => true, //è necessario abilitare questa opzione per i certificati self-signed
)
);
// Qui viene impostato il protocollo http
$worker = new Worker('http://0.0.0.0:443', $context);
// Impostare il trasporto su ssl, trasformando http+SSL in https
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
$con->send('ok');
};
Worker::runAll();
Con il codice sopra, con Workerman è stato creato un servizio https, consentendo ai client di comunicare con Workerman tramite il protocollo https con crittografia sicura.
Test:
Digitare l'indirizzo nel browser come https://domain:443
per testare la connessione.
Nota:
-
La porta https deve essere raggiunta tramite il protocollo https e non con http.
-
Di solito il certificato è associato a un dominio specifico, quindi durante il test bisogna utilizzare il dominio anziché l'indirizzo IP.
-
Se non si riesce a connettersi tramite https, controllare il firewall del server.
Utilizzare nginx come proxy SSL
Oltre a utilizzare SSL con Workerman, si può anche utilizzare nginx come proxy SSL per abilitare https.
Attenzione
Il proxy SSL di nginx e l'impostazione di SSL con Workerman sono alternative, non possono essere attivate contemporaneamente.
Il principio e il flusso della comunicazione sono i seguenti:
-
Il client avvia la connessione https verso nginx.
-
Nginx converte i dati del protocollo https in http e li inoltra alla porta http di Workerman.
-
Workerman, ricevuti i dati, li elabora e restituisce i dati del protocollo http a nginx.
-
Nginx converte nuovamente i dati del protocollo http in https e li inoltra al client.
Configurazione di Nginx
Requisiti preliminari e preparazione:
-
Si suppone che Workerman stia ascoltando sulla porta 8181 (protocollo http).
-
Il certificato (file pem/crt e chiave) è già stato ottenuto e posizionato in /etc/nginx/conf.d/ssl.
-
Si prevede di utilizzare nginx per aprire la porta 443 per offrire i servizi di proxy wss (la porta può essere modificata a seconda delle esigenze).
La configurazione di nginx è simile a quanto segue:
upstream workerman {
server 127.0.0.1:8181;
keepalive 10240;
}
server {
listen 443;
server_name domain.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 "";
}
}