Создание https-сервиса

Вопрос:

Как создать https-сервис с помощью Workerman, чтобы клиенты могли подключаться и общаться по протоколу https?

Ответ:

Протокол https на самом деле является комбинацией http и SSL, то есть это http с добавленным слоем SSL. Workerman поддерживает как http протокол, так и SSL (требуется версия Workerman >= 3.3.7), поэтому достаточно включить SSL на базе http, чтобы поддерживать протокол https.

Для того чтобы Workerman поддерживал https, существует два общих решения: первое — это непосредственно включить SSL в Workerman, а второе — использовать nginx как прокси для SSL. Вы можете выбрать одно из этих решений, нельзя настраивать оба одновременно.

Включение SSL в Workerman

Подготовительные шаги:

  1. Версия Workerman >= 3.3.7

  2. Установленный PHP с расширением openssl

  3. Полученный сертификат (файлы pem/crt и ключ) размещен в /etc/nginx/conf.d/ssl

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// Лучше использовать полученный сертификат
$context = array(
    'ssl' => array(
        'local_cert'        => '/etc/nginx/conf.d/ssl/server.pem', // Также может быть файл crt
        'local_pk'          => '/etc/nginx/conf.d/ssl/server.key',
        'verify_peer'       => false,
        'allow_self_signed' => true, // Если сертификат самоподписанный, необходимо включить эту опцию
    )
);
// Здесь используется http-протокол
$worker = new Worker('http://0.0.0.0:443', $context);
// Устанавливаем транспорт, чтобы включить ssl, превращая его в http+SSL, т.е. https
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

С помощью приведенного выше кода в Workerman создается https-сервис, и клиенты могут подключаться к Workerman через протокол https для обеспечения безопасной зашифрованной связи.

Тестирование:

Введите в адресной строке браузера https://домен:443.

Внимание:

  1. Порт https должен быть доступен только через протокол https, доступ по протоколу http невозможен.

  2. Сертификат обычно привязан к домену, поэтому во время тестирования используйте домен, а не IP-адрес.

  3. Если доступ через https невозможен, проверьте настройки брандмауэра на сервере.

Использование nginx в качестве SSL-прокси

Кроме использования собственного SSL в Workerman, вы также можете использовать nginx в качестве SSL-прокси для реализации https.

Внимание
Выберите одно из решений: прокси SSL через nginx или настройка SSL в Workerman, нельзя включать оба одновременно.

Принцип и процесс связи следующие:

  1. Клиент инициирует https-соединение с nginx.

  2. Nginx преобразует данные протокола https в http и пересылает на http-порт Workerman.

  3. Workerman обрабатывает данные и возвращает данные в формате http обратно к nginx.

  4. Nginx снова преобразует данные в формате http в https и передает их клиенту.

Пример конфигурации nginx

Предварительные условия и подготовка:

  1. Предположим, что Workerman слушает на порту 8181 (http-протокол).

  2. Получен сертификат (файлы pem/crt и ключ) размещен в /etc/nginx/conf.d/ssl.

  3. Можем использовать nginx для открытия порта 443 для предоставления wss-прокси-сервиса (порт можно изменить по необходимости).

Конфигурация nginx может выглядеть следующим образом:


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