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 并对您的应用程序运行了 安全命令,则可以使用为您的站点生成的 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 将广播消息发送到哪里。例如,在生产环境中,您可以将来自公共 Reverb 主机名(端口 443
)的请求路由到在 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
监控
Reverb 可以通过与 Laravel Pulse 集成进行监控。通过启用 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 服务器应放置在负载均衡器后面,该负载均衡器将传入请求均匀地分布到服务器之间。