Laravel WebSockets(beyondcode)突发故障:连接正常无消息
问题:生产环境Apache服务器WebSockets突发失效,客户端无法接收消息
某日生产环境Apache服务器上的WebSockets突然失效,已完成以下调试:
- 队列正常运行,执行
php artisan queue:work可见广播队列已被处理 - Socket客户端可成功连接,但无法接收任何消息
- 本地复现测试:使用beyondcode/laravel-websockets实现功能,Vue.js调试代码显示连接成功,控制台无消息输出;WebSockets仪表盘可见频道已订阅,但发送事件无反应,无报错提示
- 未修改过WebSockets相关代码,此前运行正常,怀疑是依赖包或Laravel框架更新导致兼容性问题,但无法确定具体原因
调试用Vue.js代码
import Echo from "laravel-echo"; import Pusher from "pusher-js"; window.Pusher = Pusher; const token = "44|yiPuLJM1DviFgX7Aq6cZPam86eyQMYoNssZQs2gl" const tenant = "test" window.Echo = new Echo({ broadcaster: 'pusher', key: 'laravel_rdb', wsHost: '127.0.0.1', authEndpoint: 'http://localhost/myapp/public/broadcasting/auth', encrypted: false, forceTLS: false, wsPort: 6001, wssPort:6001, disableStats: true, enabledTransports: ['ws', 'wss'], auth : { headers : { Authorization: "Bearer " + token, Accept: "application/json", 'X-Tenant': tenant, } }, }) window.Echo.private(tenant + '.notifications.user.1') .listen('NotifyUser', (e) => { console.log(e) }) window.Echo.connector.pusher.connection.bind('state_change', (state) => { console.log('Debug - Current connection state: ' + state.current); if (window.Echo.websocketsState !== '' && state.current === 'connected') { console.log("Status Update: " + state.current); } else if (window.Echo.websocketsState !== '' && state.current === 'failed') { window.Echo.reconnectInterval = window.setInterval(() => { var ifConnected = window.navigator.onLine; if (ifConnected) { clearInterval(window.Echo.reconnectInterval); console.log("Status Update 2: " + state.current); } }, 3000); } window.Echo.websocketsState = state.current; });
排查解决建议
- 检查依赖版本兼容性:对比生产环境和本地环境的
beyondcode/laravel-websockets、laravel-echo、pusher-js版本,查看是否有自动更新导致的版本不匹配。可通过composer show beyondcode/laravel-websockets和npm list laravel-echo pusher-js查看版本,尝试回退到之前稳定版本测试。 - 验证事件广播配置:检查
config/broadcasting.php中websockets驱动的配置是否正确,确认app_id、key与前端配置一致;检查事件类的broadcastOn方法,确保返回的频道名称与前端订阅的tenant + '.notifications.user.1'完全匹配,包括大小写和租户标识。 - 查看WebSockets服务日志:在生产环境启动websockets服务时开启详细日志,执行
php artisan websockets:serve --debug,观察是否有消息广播时的错误或异常输出,重点关注权限验证、频道匹配相关日志。 - 检查Apache反向代理配置:如果生产环境Apache配置了反向代理到websockets服务,确认代理配置是否支持WebSocket协议,需确保配置了
Upgrade和Connection头的转发,示例配置:ProxyPass /ws ws://127.0.0.1:6001 ProxyPassReverse /ws ws://127.0.0.1:6001 RewriteEngine On RewriteCond %{HTTP:Upgrade} =websocket [NC] RewriteRule ^/ws/(.*) ws://127.0.0.1:6001/$1 [P,L] - 验证队列任务执行细节:使用
php artisan queue:work --verbose运行队列,查看广播任务执行时的详细输出,确认事件是否正确序列化、频道是否正确指定,是否有静默失败的情况。 - 测试无租户标识的基础场景:临时简化前端订阅代码,订阅一个无需租户标识的私有频道,同时创建对应测试事件,验证是否能正常接收消息,排查租户标识是否导致频道匹配异常。
内容的提问来源于stack exchange,提问作者iamsubingyawali
相关产品推荐
相关产品推荐

