Идёт обновление сайта. Несколько дней возможны сбои в оформлении и переводах. Документация работает — если страница выглядит сломанной, обновите её позже.

Документация
L Laravel L intervention/image
Войти
Главная Laravel 10.x Laravel Reverb

Laravel Reverb

10.x 7 мар 2026 г.

#Введение

Laravel Reverb обеспечивает сверхбыструю и масштабируемую WebSocket связь в реальном времени непосредственно в вашем Laravel-приложении и предоставляет бесшовную интеграцию с существующим набором инструментов трансляции событий Laravel.

#Установка

Внимание

Laravel Reverb требует PHP 8.2+ и Laravel 10.47+.

Вы можете использовать менеджер пакетов Composer для установки Reverb в ваш Laravel-проект:

composer require laravel/reverb

После установки пакета вы можете выполнить команду установки Reverb, чтобы опубликовать конфигурацию, добавить необходимые переменные окружения и включить трансляцию событий в вашем приложении:

php artisan reverb:install

#Настройка

Команда reverb:install автоматически настроит Reverb с разумным набором параметров по умолчанию. Если вы хотите внести изменения в конфигурацию, вы можете сделать это, обновив переменные окружения Reverb или изменив файл конфигурации config/reverb.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.php. Любые запросы с источника, не указанного в списке разрешённых, будут отклонены. Для разрешения всех источников используйте *:

'apps' => [
    [
        'id' => 'my-app-id',
        'allowed_origins' => ['laravel.com'],
        // ...
    ]
]

#Дополнительные приложения

Обычно Reverb предоставляет WebSocket-сервер для приложения, в котором он установлен. Однако возможно обслуживать более одного приложения с помощью одной установки Reverb.

Например, вы можете поддерживать одно Laravel-приложение, которое через Reverb обеспечивает WebSocket-соединение для нескольких приложений. Это достигается определением нескольких apps в файле конфигурации вашего приложения config/reverb.php:

'apps' => [
    [
        'app_id' => 'my-app-one',
        // ...
    ],
    [
        'app_id' => 'my-app-two',
        // ...
    ],
],

#SSL

В большинстве случаев безопасные WebSocket-соединения обрабатываются внешним веб-сервером (Nginx и т.п.) до того, как запрос будет проксирован на ваш Reverb-сервер.

Однако иногда полезно, например, при локальной разработке, чтобы Reverb-сервер напрямую обрабатывал защищённые соединения. Если вы используете функциональность защищённых сайтов Laravel Herd или Laravel Valet и запускали команду secure для вашего приложения, вы можете использовать сертификат Herd / Valet, сгенерированный для вашего сайта, чтобы защитить соединения Reverb. Для этого установите переменную окружения REVERB_HOST в имя хоста вашего сайта или явно передайте опцию hostname при запуске сервера Reverb:

php artisan reverb:start --host="0.0.0.0" --port=8080 --hostname="laravel.test"

Поскольку домены Herd и Valet разрешаются в localhost, выполнение приведённой выше команды сделает ваш Reverb-сервер доступным по защищённому протоколу WebSocket (wss) по адресу wss://laravel.test:8080.

Вы также можете вручную выбрать сертификат, определив опции tls в файле конфигурации вашего приложения config/reverb.php. В массиве опций tls можно указать любые параметры, поддерживаемые SSL контекстом PHP:

'options' => [
    'tls' => [
        'local_cert' => '/path/to/cert.pem'
    ],
],

#Запуск сервера

Сервер Reverb можно запустить с помощью Artisan-команды reverb:start:

php artisan reverb:start

По умолчанию сервер Reverb запускается на 0.0.0.0:8080, что делает его доступным на всех сетевых интерфейсах.

Если необходимо указать собственный хост или порт, это можно сделать с помощью опций --host и --port при запуске сервера:

php artisan reverb:start --host=127.0.0.1 --port=9000

Альтернативно, вы можете определить переменные окружения REVERB_SERVER_HOST и REVERB_SERVER_PORT в файле .env вашего приложения.

Переменные окружения REVERB_SERVER_HOST и REVERB_SERVER_PORT не следует путать с REVERB_HOST и REVERB_PORT. Первые задают хост и порт, на которых запускается сам сервер Reverb, тогда как вторые указывают Laravel, куда отправлять сообщения трансляции. Например, в продакшене вы можете направлять запросы с публичного хоста Reverb на порт 443 к серверу Reverb, работающему на 0.0.0.0:8080. В этом случае переменные окружения будут выглядеть так:

REVERB_SERVER_HOST=0.0.0.0
REVERB_SERVER_PORT=8080

REVERB_HOST=ws.laravel.com
REVERB_PORT=443

#Отладка

Для повышения производительности Reverb по умолчанию не выводит отладочную информацию. Если вы хотите видеть поток данных, проходящих через сервер Reverb, используйте опцию --debug при запуске команды reverb:start:

php artisan reverb:start --debug

#Перезапуск

Поскольку Reverb — это процесс с длительным временем работы, изменения в коде не будут применены без перезапуска сервера через Artisan-команду reverb:restart.

Команда reverb:restart гарантирует корректное завершение всех соединений перед остановкой сервера. Если вы запускаете Reverb с менеджером процессов, например Supervisor, сервер будет автоматически перезапущен менеджером после завершения всех соединений:

php artisan reverb:restart

#Запуск Reverb в продакшене

Из-за длительного времени работы WebSocket-серверов может потребоваться оптимизация сервера и хостинг-среды, чтобы обеспечить эффективную обработку оптимального количества соединений с учётом ресурсов сервера.

Примечание

Если ваш сайт управляется через Laravel Forge, вы можете автоматически оптимизировать сервер для Reverb прямо из панели "Application". Включив интеграцию Reverb, Forge обеспечит готовность сервера к продакшену, включая установку необходимых расширений и увеличение допустимого количества соединений.

#Открытые файлы

Каждое WebSocket-соединение удерживается в памяти до тех пор, пока клиент или сервер не разорвут его. В Unix и подобных системах каждое соединение представлено файлом. Однако часто существуют ограничения на количество открытых файлов как на уровне ОС, так и на уровне приложения.

#Операционная система

В Unix-подобной ОС вы можете узнать допустимое количество открытых файлов с помощью команды ulimit:

ulimit -n

Эта команда покажет лимиты открытых файлов для разных пользователей. Вы можете изменить эти значения, отредактировав файл /etc/security/limits.conf. Например, чтобы увеличить максимальное количество открытых файлов до 10 000 для пользователя forge, добавьте следующее:

# /etc/security/limits.conf
forge        soft  nofile  10000
forge        hard  nofile  10000

#Цикл событий

В основе Reverb лежит цикл событий ReactPHP для управления WebSocket-соединениями на сервере. По умолчанию этот цикл использует stream_select, который не требует дополнительных расширений. Однако stream_select обычно ограничен 1024 открытыми файлами. Поэтому, если вы планируете обрабатывать более 1000 одновременных соединений, потребуется использовать альтернативный цикл событий без таких ограничений.

Reverb автоматически переключится на цикл, основанный на ext-event, ext-ev или ext-uv, если они доступны. Все эти расширения PHP можно установить через PECL:

pecl install event
# или
pecl install ev
# или
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;
    }

    ...
}

Обычно веб-серверы ограничивают количество разрешённых соединений, чтобы избежать перегрузки. Чтобы увеличить число разрешённых соединений на Nginx до 10 000, следует обновить значения worker_rlimit_nofile и worker_connections в файле nginx.conf:

user forge;
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

The output above shows the server can handle a maximum of 28,231 (60,999 - 32,768) connections since each connection requires a free port. Although we recommend horizontal scaling to increase the number of allowed connections, you may increase the number of available open ports by updating the allowed port range in your server's /etc/sysctl.conf configuration file.

#Process Management

In most cases, you should use a process manager such as Supervisor to ensure the Reverb server is continually running. If you are using Supervisor to run Reverb, you should update the minfds setting of your server's supervisor.conf file to ensure Supervisor is able to open the files required to handle connections to your Reverb server:

[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 должны находиться за балансировщиком нагрузки, который равномерно распределяет входящие запросы между серверами.