Создание HTTPS-сервиса
Вопрос:
Как создать службу HTTPS с помощью Workerman, чтобы клиенты могли устанавливать соединение через протокол HTTPS.
Ответ:
Протокол HTTPS на самом деле представляет собой сочетание протоколов HTTP и SSL, то есть добавление слоя SSL поверх протокола HTTP. Workerman поддерживает протокол HTTP, а также поддерживает SSL (необходимо использовать версию Workerman >= 3.3.7), поэтому для поддержки протокола HTTPS достаточно просто включить SSL поверх протокола HTTP.
Существует два распространенных способа добавления поддержки HTTPS в Workerman: прямое включение SSL в Workerman или использование Nginx в качестве прокси для SSL. Нужно выбрать один из этих методов, нельзя использовать оба сразу.
Включение SSL в Workerman
Подготовительные шаги:
- Версия Workerman >= 3.3.7
- Установленное расширение openssl для PHP
- Сертификат (файлы 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 в HTTPS
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
$con->send('ok');
};
Worker::runAll();
С помощью этого кода в Workerman создается служба HTTPS, что позволяет клиентам устанавливать защищенное шифрование соединение с Workerman.
Тестирование:
Введите в адресной строке браузера https://domain_name: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 снова преобразует данные в протокол HTTPS и отправляет их клиенту
Пример конфигурации Nginx
Предположения и подготовительные шаги:
- Предполагается, что Workerman слушает порт 8181 (протокол HTTP)
- Сертификат (файлы pem/crt и ключевой файл) размещены в каталоге /etc/nginx/conf.d/ssl
- Планируется использовать порт 443 через Nginx для предоставления сервиса wss (порт можно изменить по необходимости)
Пример конфигурации Nginx:
upstream workerman {
server 127.0.0.1:8181;
keepalive 10240;
}
server {
listen 443;
server_name site_domain.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 "";
}
}