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:

  1. Workerman versão >=3.3.7

  2. A extensão openssl está instalada no PHP

  3. 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:

  1. A porta https deve ser acessada via protocolo https; o protocolo http não pode acessar.

  2. O certificado geralmente está vinculado ao domínio, portanto, ao testar, use um domínio e não um IP.

  3. 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:

  1. O cliente inicia uma conexão https para o nginx

  2. O nginx converte os dados do protocolo https em dados do protocolo http e os encaminha para a porta http do Workerman

  3. O Workerman recebe os dados, processa a lógica de negócios e retorna os dados do protocolo http para o nginx

  4. 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:

  1. Suponha que o Workerman esteja ouvindo na porta 8181 (protocolo http)

  2. Um certificado já foi solicitado (arquivo pem/crt e arquivo key) e colocado em /etc/nginx/conf.d/ssl

  3. 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 "";
  }
}