Создание 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
Подготовительные шаги:
-
Версия Workerman >= 3.3.7
-
Установленный PHP с расширением openssl
-
Полученный сертификат (файлы 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.
Внимание:
-
Порт https должен быть доступен только через протокол https, доступ по протоколу http невозможен.
-
Сертификат обычно привязан к домену, поэтому во время тестирования используйте домен, а не IP-адрес.
-
Если доступ через https невозможен, проверьте настройки брандмауэра на сервере.
Использование nginx в качестве SSL-прокси
Кроме использования собственного SSL в Workerman, вы также можете использовать nginx в качестве SSL-прокси для реализации https.
Внимание
Выберите одно из решений: прокси SSL через nginx или настройка SSL в Workerman, нельзя включать оба одновременно.
Принцип и процесс связи следующие:
-
Клиент инициирует https-соединение с nginx.
-
Nginx преобразует данные протокола https в http и пересылает на http-порт Workerman.
-
Workerman обрабатывает данные и возвращает данные в формате http обратно к nginx.
-
Nginx снова преобразует данные в формате http в https и передает их клиенту.
Пример конфигурации nginx
Предварительные условия и подготовка:
-
Предположим, что Workerman слушает на порту 8181 (http-протокол).
-
Получен сертификат (файлы pem/crt и ключ) размещен в /etc/nginx/conf.d/ssl.
-
Можем использовать 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 "";
}
}