Creare un servizio https
Domanda:
Come può Workerman creare un servizio https in modo che il client possa connettersi e comunicare tramite https?
Risposta:
Il protocollo https è in realtà http+SSL, ovvero si aggiunge uno strato SSL al protocollo http. Workerman supporta il protocollo http e supporta anche SSL (è necessario Workerman versione >=3.3.7), quindi è sufficiente attivare SSL per supportare il protocollo https.
Ci sono due soluzioni generali per far sì che Workerman supporti https: una consiste nell'attivare direttamente SSL in Workerman, mentre l'altra consiste nell'utilizzare nginx come proxy SSL. È possibile sceglierne solo una, non è possibile impostarle entrambe contemporaneamente.
Attivazione di SSL in Workerman
Prerequisiti:
-
Workerman versione >= 3.3.7
-
PHP con l'estensione openssl installata
-
Certificato già richiesto (file pem/crt e file key) posizionato in /etc/nginx/conf.d/ssl
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// È meglio utilizzare un certificato richiesto
$context = array(
'ssl' => array(
'local_cert' => '/etc/nginx/conf.d/ssl/server.pem', // Può essere anche un file crt
'local_pk' => '/etc/nginx/conf.d/ssl/server.key',
'verify_peer' => false,
'allow_self_signed' => true, // Se si tratta di un certificato autofirmato, si deve abilitare questa opzione
)
);
// Qui si imposta il protocollo http
$worker = new Worker('http://0.0.0.0:443', $context);
// Imposta il transport per attivare ssl, trasformandolo in http+SSL ovvero https
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
$con->send('ok');
};
Worker::runAll();
Con il codice sopra di Workerman, è stato creato un servizio https, e il client può collegarsi a Workerman attraverso il protocollo https per realizzare comunicazioni criptate in modo sicuro.
Test:
Inserire nella barra degli indirizzi del browser https://dominio:443 per accedere.
Nota:
-
La porta https deve essere accessibile tramite il protocollo https, non è possibile accedervi tramite il protocollo http.
-
Il certificato è generalmente legato al nome di dominio, quindi durante il test si prega di utilizzare un nome di dominio, non un indirizzo IP.
-
Se non è possibile accedere tramite https, controllare il firewall del server.
Utilizzare nginx come proxy ssl
Oltre ad utilizzare il SSL di Workerman, è possibile utilizzare nginx come proxy SSL per implementare https.
Attenzione
È possibile scegliere tra nginx come proxy SSL e la configurazione di SSL in Workerman, non possono essere entrambe attivate contemporaneamente.
Il principio e il flusso di comunicazione sono:
-
Il client avvia la connessione https verso nginx
-
nginx converte i dati del protocollo https in protocollo http e li inoltra alla porta http di Workerman
-
Workerman riceve i dati, esegue la logica aziendale e restituisce i dati del protocollo http a nginx
-
nginx converte nuovamente i dati del protocollo http in https e li inoltra al client
Esempio di configurazione di nginx
Prerequisiti e attività preliminari:
-
Si presume che Workerman stia ascoltando sulla porta 8181 (protocollo http)
-
Certificato già richiesto (file pem/crt e file key) posizionato in /etc/nginx/conf.d/ssl
-
Si intende utilizzare nginx per attivare la porta 443 per fornire servizi di proxy wss (la porta può essere modificata a seconda delle necessità)
La configurazione di nginx sarà simile a questa:
upstream workerman {
server 127.0.0.1:8181;
keepalive 10240;
}
server {
listen 443;
server_name dominio.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 "";
}
}