Criar serviço https
Pergunta:
Como o Workerman pode criar um serviço https para que os clientes se conectem e se comuniquem via https?
Resposta:
O protocolo https é na verdade http + SSL, que adiciona uma camada SSL sobre o protocolo http. O Workerman suporta o protocolo http, assim como também suporta SSL (é necessário Workerman versão >=3.3.7), portanto, basta ativar SSL sobre o protocolo http para suportar o protocolo https.
Há duas abordagens gerais para permitir que o Workerman suporte https: uma é ativar o SSL diretamente no Workerman, e a outra é usar o nginx como um proxy SSL. Apenas uma das duas opções deve ser escolhida; ambas não podem ser configuradas simultaneamente.
Ativar SSL no Workerman
Pré-requisitos:
-
Workerman versão >=3.3.7
-
A extensão openssl está instalada no PHP
-
Um certificado já foi solicitado (arquivo pem/crt e arquivo key) e colocado em /etc/nginx/conf.d/ssl
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// O certificado deve ser um certificado solicitado
$context = array(
'ssl' => array(
'local_cert' => '/etc/nginx/conf.d/ssl/server.pem', // Pode ser um arquivo crt também
'local_pk' => '/etc/nginx/conf.d/ssl/server.key',
'verify_peer' => false,
'allow_self_signed' => true, // Se for um certificado autoassinado, esta opção deve ser ativada
)
);
// Aqui está definido o protocolo http
$worker = new Worker('http://0.0.0.0:443', $context);
// Configurando o transport para ativar ssl, transformando http+SSL em https
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
$con->send('ok');
};
Worker::runAll();
Com o código acima do Workerman, um serviço https foi criado, permitindo que o cliente se conecte ao Workerman via protocolo https para garantir uma comunicação criptografada segura.
Teste:
Digite https://domínio:443 na barra de endereços do navegador para acessar.
Atenção:
-
A porta https deve ser acessada via protocolo https; o protocolo http não pode acessar.
-
O certificado geralmente está vinculado ao domínio, portanto, ao testar, use um domínio e não um IP.
-
Se você não conseguir acessar via https, verifique o firewall do servidor.
Usando o nginx como proxy SSL
Além de usar o SSL nativo do Workerman, você também pode usar o nginx como um proxy SSL para implementar https.
Atenção
O proxy SSL do nginx e a configuração de SSL no Workerman são opções mutuamente exclusivas; não podem ser ativadas simultaneamente.
O princípio e o fluxo de comunicação são:
-
O cliente inicia uma conexão https para o nginx
-
O nginx converte os dados do protocolo https em dados do protocolo http e os encaminha para a porta http do Workerman
-
O Workerman recebe os dados, processa a lógica de negócios e retorna os dados do protocolo http para o nginx
-
O nginx converte os dados do protocolo http de volta para https e os encaminha para o cliente
Configuração de referência do nginx
Condições e preparativos:
-
Suponha que o Workerman esteja ouvindo na porta 8181 (protocolo http)
-
Um certificado já foi solicitado (arquivo pem/crt e arquivo key) e colocado em /etc/nginx/conf.d/ssl
-
Planeja-se usar o nginx para abrir a porta 443, oferecendo serviços de proxy wss (a porta pode ser alterada conforme necessário)
A configuração do nginx é semelhante a esta:
upstream workerman {
server 127.0.0.1:8181;
keepalive 10240;
}
server {
listen 443;
server_name domínio_do_site.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 "";
}
}