多服务器部署Laravel Websockets时队列端无法广播通知如何解决
初始疑问解答
- 队列工作服务器不需要运行
php artisan websockets:serve,仅应用服务器需要运行该服务作为统一的WebSocket消息中心,多服务端部署会导致消息路由分散,用户端无法接收到对应消息。 - 初始配置中将队列服务器的
PUSHER_ENDPOINT_HOST设为应用服务器私有IP是完全正确的,后续修改为公有域名反而增加了不必要的SSL验证环节,更容易出现连通问题。
当前配置问题排查&修复步骤
1. 清理冗余服务
首先停止队列服务器上的php artisan websockets:serve进程,删除Laravel Forge中对应队列服务器的WebSocket守护进程,仅保留应用服务器的WebSocket服务即可。
2. 修正队列服务器专属配置
队列服务器走私有网络直接访问应用服务器的WebSocket服务即可,无需走公网域名和SSL,修改队列服务器.env配置:
# PUSHER_APP_ID、KEY、SECRET、CLUSTER保持和应用服务器一致 PUSHER_ENDPOINT_HOST=应用服务器私有IP PUSHER_PORT=6001 PUSHER_SCHEME=http
队列服务器的broadcasting.php保持初始版本即可:
'pusher' => [ 'driver' => 'pusher', 'key' => env('PUSHER_APP_KEY'), 'secret' => env('PUSHER_APP_SECRET'), 'app_id' => env('PUSHER_APP_ID'), 'options' => [ 'cluster' => env('PUSHER_APP_CLUSTER'), 'encrypted' => in_array(config('app.env'), ['production', 'staging']), 'host' => env('PUSHER_ENDPOINT_HOST', '127.0.0.1'), 'port' => 6001, 'scheme' => 'http' ], ],
应用服务器的配置可保持现有公网域名配置,用于给前端浏览器提供WebSocket连接,两端配置不需要完全一致。
3. 修复前端配置笔误
- 修正
.env文件中VITE配置漏写的$符号:
VITE_PUSHER_SCHEME=${PUSHER_SCHEME} VITE_PUSHER_PORT=${PUSHER_PORT}
- 修正
echo.js端口配置,公网WebSocket统一走443端口即可:
window.Echo = new Echo({ broadcaster: 'pusher', key: import.meta.env.VITE_PUSHER_APP_KEY, cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER, wsHost: import.meta.env.VITE_PUSHER_HOST, wsPort: 443, wssPort: 443, forceTLS: true, disableStats: true, scheme: import.meta.env.VITE_PUSHER_SCHEME, enabledTransports: ["ws", "wss"], });
修改完成后重新编译前端资源。
4. 验证内网连通性
在队列服务器执行以下命令,验证是否能正常访问应用服务器的WebSocket服务端口:
curl http://应用服务器私有IP:6001/api/rooms
正常会返回JSON格式的房间列表数据,若访问失败,检查应用服务器防火墙规则,开放私有网段对6001端口的访问权限即可。
内容的提问来源于stack exchange,提问作者senty
相关产品推荐
相关产品推荐

