Laravel Reverb
介绍
Laravel Reverb 将快速且可扩展的实时 WebSocket 通信直接带入你的 Laravel 应用程序,并提供与 Laravel 现有 事件广播工具 套件的无缝集成。
安装
你可以使用 install:broadcasting
Artisan 命令安装 Reverb
php artisan install:broadcasting
配置
在幕后,install:broadcasting
Artisan 命令将运行 reverb:install
命令,该命令将使用一组合理的默认配置选项安装 Reverb。如果你想进行任何配置更改,你可以通过更新 Reverb 的环境变量或更新 config/reverb.php
配置文件来实现。
应用程序凭据
为了建立与 Reverb 的连接,客户端和服务器之间必须交换一组 Reverb “应用程序” 凭据。这些凭据在服务器上配置,用于验证来自客户端的请求。你可以使用以下环境变量定义这些凭据
REVERB_APP_ID=my-app-idREVERB_APP_KEY=my-app-keyREVERB_APP_SECRET=my-app-secret
允许的来源
你还可以通过更新 config/reverb.php
配置文件中 apps
部分的 allowed_origins
配置值来定义客户端请求的来源。任何来自未列在你的允许来源中的请求都将被拒绝。你可以使用 *
允许所有来源
'apps' => [ [ 'id' => 'my-app-id', 'allowed_origins' => ['laravel.com'], // ... ]]
其他应用程序
通常,Reverb 为安装它的应用程序提供 WebSocket 服务器。但是,可以使用单个 Reverb 安装来为多个应用程序提供服务。
例如,你可能希望维护一个单独的 Laravel 应用程序,该应用程序通过 Reverb 为多个应用程序提供 WebSocket 连接。这可以通过在你的应用程序的 config/reverb.php
配置文件中定义多个 apps
来实现
'apps' => [ [ 'app_id' => 'my-app-one', // ... ], [ 'app_id' => 'my-app-two', // ... ],],
SSL
在大多数情况下,安全的 WebSocket 连接由上游 Web 服务器(Nginx 等)处理,然后再将请求代理到你的 Reverb 服务器。
但是,有时让 Reverb 服务器直接处理安全连接可能很有用,例如在本地开发期间。如果你正在使用 Laravel Herd 的安全站点功能,或者你正在使用 Laravel Valet 并且已经对你的应用程序运行了 secure 命令,则可以使用为你的站点生成的 Herd / Valet 证书来保护你的 Reverb 连接。为此,请将 REVERB_HOST
环境变量设置为你的站点的主机名,或者在启动 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
上访问。
你还可以通过在你的应用程序的 config/reverb.php
配置文件中定义 tls
选项来手动选择证书。在 tls
选项的数组中,你可以提供 PHP 的 SSL 上下文选项支持的任何选项
'options' => [ 'tls' => [ 'local_cert' => '/path/to/cert.pem' ],],
运行服务器
可以使用 reverb:start
Artisan 命令启动 Reverb 服务器
php artisan reverb:start
默认情况下,Reverb 服务器将在 0.0.0.0:8080
启动,使其可以从所有网络接口访问。
如果需要指定自定义主机或端口,可以在启动服务器时通过 --host
和 --port
选项进行指定
php artisan reverb:start --host=127.0.0.1 --port=9000
或者,你可以在应用程序的 .env
配置文件中定义 REVERB_SERVER_HOST
和 REVERB_SERVER_PORT
环境变量。
REVERB_SERVER_HOST
和 REVERB_SERVER_PORT
环境变量不应与 REVERB_HOST
和 REVERB_PORT
混淆。前者指定运行 Reverb 服务器本身的主机和端口,而后者指示 Laravel 将广播消息发送到哪里。例如,在生产环境中,你可以将来自端口 443
上公共 Reverb 主机名的请求路由到在 0.0.0.0:8080
上运行的 Reverb 服务器。在这种情况下,你的环境变量将定义如下
REVERB_SERVER_HOST=0.0.0.0REVERB_SERVER_PORT=8080 REVERB_HOST=ws.laravel.comREVERB_PORT=443
调试
为了提高性能,Reverb 默认不输出任何调试信息。如果你想查看流经 Reverb 服务器的数据流,可以向 reverb:start
命令提供 --debug
选项
php artisan reverb:start --debug
重启
由于 Reverb 是一个长时间运行的进程,因此如果没有通过 reverb:restart
Artisan 命令重启服务器,你的代码更改将不会反映出来。
reverb:restart
命令确保在停止服务器之前优雅地终止所有连接。如果你正在使用 Supervisor 等进程管理器运行 Reverb,则在所有连接终止后,进程管理器将自动重启服务器
php artisan reverb:restart
监控
可以通过与 Laravel Pulse 的集成来监视 Reverb。通过启用 Reverb 的 Pulse 集成,你可以跟踪服务器处理的连接和消息数量。
要启用集成,你应该首先确保你已经 安装了 Pulse。然后,将任何 Reverb 的记录器添加到应用程序的 config/pulse.php
配置文件中
use Laravel\Reverb\Pulse\Recorders\ReverbConnections;use Laravel\Reverb\Pulse\Recorders\ReverbMessages; 'recorders' => [ ReverbConnections::class => [ 'sample_rate' => 1, ], ReverbMessages::class => [ 'sample_rate' => 1, ], ...],
接下来,将每个记录器的 Pulse 卡片添加到你的 Pulse 仪表板中
<x-pulse> <livewire:reverb.connections cols="full" /> <livewire:reverb.messages cols="full" /> ...</x-pulse>
在生产环境中运行 Reverb
由于 WebSocket 服务器的长期运行性质,你可能需要对服务器和托管环境进行一些优化,以确保你的 Reverb 服务器可以有效地处理服务器上可用资源的最佳连接数。
如果你的站点由 Laravel Forge 管理,你可以直接从“应用程序”面板自动优化你的服务器以进行 Reverb 处理。通过启用 Reverb 集成,Forge 将确保你的服务器已准备好投入生产,包括安装任何所需的扩展程序并增加允许的连接数。
打开文件
每个 WebSocket 连接都保存在内存中,直到客户端或服务器断开连接。在 Unix 和类 Unix 环境中,每个连接都由一个文件表示。但是,操作系统和应用程序级别通常都对允许的打开文件数有限制。
操作系统
在基于 Unix 的操作系统上,你可以使用 ulimit
命令确定允许的打开文件数
ulimit -n
此命令将显示不同用户允许的打开文件限制。您可以通过编辑 /etc/security/limits.conf
文件来更新这些值。例如,将 forge
用户的最大打开文件数更新为 10,000,如下所示:
# /etc/security/limits.confforge soft nofile 10000forge hard nofile 10000
事件循环
在底层,Reverb 使用 ReactPHP 事件循环来管理服务器上的 WebSocket 连接。默认情况下,此事件循环由 stream_select
提供支持,它不需要任何额外的扩展。但是,stream_select
通常限制为 1,024 个打开的文件。因此,如果您计划处理超过 1,000 个并发连接,则需要使用不受相同限制约束的替代事件循环。
当可用时,Reverb 会自动切换到由 ext-uv
支持的循环。此 PHP 扩展可以通过 PECL 安装。
pecl install uv
Web 服务器
在大多数情况下,Reverb 在您服务器上一个非面向 Web 的端口上运行。因此,为了将流量路由到 Reverb,您应该配置一个反向代理。假设 Reverb 运行在主机 0.0.0.0
和端口 8080
上,并且您的服务器使用 Nginx Web 服务器,则可以使用以下 Nginx 站点配置为您的 Reverb 服务器定义反向代理:
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 在 /app
监听 WebSocket 连接,并在 /apps
处理 API 请求。您应该确保处理 Reverb 请求的 Web 服务器可以服务这两个 URI。如果您使用 Laravel Forge 来管理您的服务器,您的 Reverb 服务器将默认正确配置。
通常,Web 服务器被配置为限制允许的连接数,以防止服务器过载。要将 Nginx Web 服务器上允许的连接数增加到 10,000,应更新 nginx.conf
文件的 worker_rlimit_nofile
和 worker_connections
值。
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
上面的输出显示服务器最多可以处理 28,231 个连接(60,999 - 32,768),因为每个连接都需要一个空闲端口。尽管我们建议 水平扩展 以增加允许的连接数,但您可以通过更新服务器 /etc/sysctl.conf
配置文件中允许的端口范围来增加可用的打开端口数量。
进程管理
在大多数情况下,您应该使用诸如 Supervisor 之类的进程管理器来确保 Reverb 服务器持续运行。如果您使用 Supervisor 运行 Reverb,则应更新服务器 supervisor.conf
文件的 minfds
设置,以确保 Supervisor 能够打开处理 Reverb 服务器连接所需的文件。
[supervisord]...minfds=10000
扩展
如果您需要处理超过单个服务器允许的连接数,则可以水平扩展 Reverb 服务器。利用 Redis 的发布/订阅功能,Reverb 能够跨多个服务器管理连接。当您的应用程序的其中一个 Reverb 服务器收到消息时,该服务器将使用 Redis 将传入的消息发布到所有其他服务器。
要启用水平扩展,您应该在应用程序的 .env
配置文件中将 REVERB_SCALING_ENABLED
环境变量设置为 true
。
REVERB_SCALING_ENABLED=true
接下来,您应该有一个专用的中央 Redis 服务器,所有 Reverb 服务器都将与该服务器通信。Reverb 将使用 为您的应用程序配置的默认 Redis 连接将消息发布到您的所有 Reverb 服务器。
一旦您启用了 Reverb 的缩放选项并配置了 Redis 服务器,您只需在可以与 Redis 服务器通信的多个服务器上调用 reverb:start
命令即可。这些 Reverb 服务器应放置在负载均衡器之后,该负载均衡器将传入的请求均匀地分配到各个服务器之间。