Darklyy Reverb обеспечивает взаимодействие WebSocket в реальном времени для приложений Darklyy.
Установка через Composer
Чтобы установить пакет достаточно ввести в консоле следующую команду:
composer require pris/darklyy-reverb
Если вы хотите внести какие-либо изменения в конфигурацию, это можно сделать, обновив переменные окружения Reverb или файл конфигурации config/reverb.config.php.
Для установления соединения с Reverb клиент и сервер должны обменяться набором учётных данных «приложения» Reverb. Эти учётные данные настраиваются на сервере и используются для проверки запроса клиента. Вы можете определить эти учётные данные, используя следующие переменные среды:
REVERB_APP_ID=my-app-id
REVERB_APP_KEY=my-app-key
REVERB_APP_SECRET=my-app-secret
Вы также можете определить источники, из которых могут поступать клиентские запросы, обновив значение параметра allowed_origins в конфигурации apps в соответствующем разделе config/reverb.config.php файла конфигурации. Любые запросы из источников, не указанных в списке разрешенных источников, будут отклонены. Вы можете разрешить все источники, используя *:
'apps' => [
[
'app_id' => 'my-app-id',
'allowed_origins' => ['darklyy.ru'],
// ...
]
]
Обычно Reverb предоставляет WebSocket-сервер для приложения, в котором он установлен. Однако, используя одну установку Reverb, можно обслуживать несколько приложений.
Например, вам может понадобиться поддерживать одно приложение Darklyy, которое через Reverb обеспечивает подключение WebSocket для нескольких приложений. Этого можно добиться, определив несколько приложений в файле конфигурации: config/reverb.config.php
'apps' => [
[
'app_id' => 'my-app-one',
// ...
],
[
'app_id' => 'my-app-two',
// ...
],
],
В большинстве случаев безопасные соединения WebSocket обрабатываются вышестоящим веб-сервером (Nginx и т. д.) до того, как запрос будет передан на ваш сервер Reverb.
Однако вы также можете вручную выбрать сертификат, указав tls параметры в файле конфигурации вашего приложения config/reverb.config.php. В этом массиве tls параметров вы можете указать любой из поддерживаемых PHP's SSL context options:
'options' => [
'tls' => [
'local_cert' => '/path/to/cert.pem'
],
],
Сервер Reverb можно запустить с помощью darksander командыreverb:start:
php darksander reverb:start
По умолчанию сервер Reverb будет запущен на адресе 0.0.0.0:8080, что сделает его доступным со всех сетевых интерфейсов.
Если вам необходимо указать собственный хост или порт, вы можете сделать это с помощью параметров --host и --port при запуске сервера:
php darksander reverb:start --host=127.0.0.1 --port=9000
В качестве альтернативы вы можете определить переменные REVERB_SERVER_HOST и REVERB_SERVER_PORT в файле .env конфигурации вашего приложения.
Переменные окружения REVERB_SERVER_HOST и REVERB_SERVER_PORT не следует путать с переменными окружения REVERB_HOST and REVERB_PORT. Первые указывают хост и порт, на которых будет работать сам сервер Reverb, а вторая пара указывает Darklyy, куда отправлять широковещательные сообщения. Например, в рабочей среде вы можете направлять запросы с вашего публичного имени хоста Reverb на порт 443 на сервер Reverb, работающий на 0.0.0.0:8080. В этом случае переменные окружения будут определены следующим образом:
REVERB_SERVER_HOST=0.0.0.0
REVERB_SERVER_PORT=8080
REVERB_HOST=ws.darklyy.ru
REVERB_PORT=443
Для повышения производительности Reverb по умолчанию не выводит отладочную информацию. Если вы хотите видеть поток данных, проходящий через сервер Reverb, вы можете добавить соответствующую --debug опцию при вызове комены reverb:start:
php darksander reverb:start --debug
Поскольку Reverb — это длительный процесс, изменения в вашем коде не будут отражены без перезапуска сервера с помощью команды reverb:restart.
Эта команды reverb:restart обеспечивает корректное завершение всех подключений перед остановкой сервера. Если Reverb запущен с менеджером процессов, например Supervisor, сервер будет автоматически перезапущен менеджером процессов после завершения всех подключений:
php darksander reverb:restart
В связи с длительной работой серверов WebSocket вам может потребоваться выполнить некоторую оптимизацию вашего сервера и среды хостинга, чтобы ваш сервер Reverb мог эффективно обрабатывать оптимальное количество соединений для ресурсов, доступных на вашем сервере.
Каждое соединение WebSocket сохраняется в памяти до тех пор, пока клиент или сервер не отключится. В Unix и Unix-подобных средах каждое соединение представлено файлом. Однако часто существуют ограничения на количество открытых файлов как на уровне операционной системы, так и на уровне приложения.
В операционной системе на базе Unix вы можете определить допустимое количество открытых файлов с помощью ulimit команды:
ulimit -n
Эта команда отобразит ограничения на количество открытых файлов для разных пользователей. Вы можете изменить эти значения, отредактировав /etc/security/limits.conf файл. Например, обновление максимального количества открытых файлов для пользователя user до 10 000 будет выглядеть следующим образом:
# /etc/security/limits.conf
user soft nofile 10000
user hard nofile 10000
В основе Reverb лежит цикл событий ReactPHP для управления соединениями WebSocket на сервере. По умолчанию этот цикл событий реализован на основе stream_select, что не требует дополнительных расширений. Однако stream_select обычно ограничено 1024 открытыми файлами. Поэтому, если вы планируете обрабатывать более 1000 одновременных соединений, вам потребуется использовать альтернативный цикл событий, не связанный такими ограничениями.
Reverb автоматически переключится на ext-uv активный цикл, когда он доступен. Это расширение PHP доступно для установки через PECL:
pecl install uv
В большинстве случаев Reverb работает на порту вашего сервера, не подключенном к интернету. Поэтому для маршрутизации трафика в Reverb необходимо настроить обратный прокси-сервер. Если Reverb работает на указанном хосте 0.0.0.0 и порту 8080, а ваш сервер использует веб-сервер Nginx, обратный прокси-сервер можно настроить для вашего сервера Reverb, используя следующую конфигурацию сайта Nginx:
server {
...
location / {
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header SERVER_PORT $server_port;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://0.0.0.0:8080;
}
...
}
Reverb прослушивает WebSocket-подключения
/appи обрабатывает запросы API по адресу/apps. Необходимо убедиться, что веб-сервер, обрабатывающий запросы Reverb, может обслуживать оба этих URI.
Обычно веб-серверы настроены на ограничение количества разрешённых подключений во избежание перегрузки сервера. Чтобы увеличить количество разрешённых подключений на веб-сервере Nginx до 10 000, необходимо обновить значения worker_rlimit_nofile и в файле: worker_connectionsnginx.conf
user user;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
worker_rlimit_nofile 10000;
events {
worker_connections 10000;
multi_accept on;
}
Приведённая выше конфигурация позволяет запускать до 10 000 рабочих процессов Nginx на один процесс. Кроме того, эта конфигурация устанавливает ограничение на количество открытых файлов Nginx в 10 000.
Операционные системы на базе Unix обычно ограничивают количество портов, которые можно открыть на сервере. Текущий разрешенный диапазон можно узнать с помощью следующей команды:
cat /proc/sys/net/ipv4/ip_local_port_range
# 32768 60999
Вывод выше показывает, что сервер может обрабатывать максимум 28 231 (60 999–32 768) подключений, поскольку для каждого подключения требуется свободный порт. Хотя мы рекомендуем горизонтальное масштабирование для увеличения количества разрешённых подключений, вы можете увеличить количество доступных открытых портов, обновив диапазон разрешённых портов в файле конфигурации сервера /etc/sysctl.conf.
В большинстве случаев для обеспечения непрерывной работы сервера Reverb следует использовать менеджер процессов, например Supervisor. Если вы используете Supervisor для запуска Reverb, вам следует обновить настройки minfds сервера в файле supervisor.conf, чтобы Supervisor мог открывать файлы, необходимые для обработки подключений к серверу Reverb:
[supervisord]
...
minfds=10000
Если вам нужно обрабатывать больше подключений, чем может обеспечить один сервер, вы можете масштабировать сервер Reverb горизонтально. Используя возможности публикации и подписки Redis, Reverb может управлять подключениями между несколькими серверами. Когда сообщение поступает на один из серверов Reverb вашего приложения, этот сервер использует Redis для публикации входящего сообщения на всех остальных серверах.
Чтобы включить горизонтальное масштабирование, необходимо установить переменную среды REVERB_SCALING_ENABLED в значение true в файле конфигурации вашего приложения .env:
REVERB_SCALING_ENABLED=true
Далее вам потребуется выделенный центральный сервер Redis, к которому будут подключаться все серверы Reverb. Reverb будет использовать подключение Redis по умолчанию, настроенное для вашего приложения, для публикации сообщений на всех ваших серверах Reverb.
После включения функции масштабирования Reverb и настройки сервера Redis вы можете просто вызвать reverb:start команду на нескольких серверах, которые могут взаимодействовать с вашим сервером Redis. Эти серверы Reverb следует разместить за балансировщиком нагрузки, который равномерно распределяет входящие запросы между серверами.