You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:10:35