Laravel Websockets生产环境可连接订阅频道但事件不触发
问题描述
本地环境集成Laravel Websockets与Echo后所有功能运行正常,部署到生产环境后,可正常建立连接、订阅频道,但事件无法触发,暂未定位到配置错误。
现有配置信息
.env 文件配置
BROADCAST_DRIVER=pusher PUSHER_APP_ID=someID PUSHER_APP_KEY=someKey PUSHER_APP_SECRET=someSecret PUSHER_APP_CLUSTER=eu PUSHER_SCHEME=http PUSHER_USE_SSL=false MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" MIX_PUSHER_USE_SSL=true MIX_PUSHER_HOST=mydomain.com MIX_PUSHER_PORT=443
Echo 前端配置
window.Echo = new Echo({ broadcaster: 'pusher', key: process.env.MIX_PUSHER_APP_KEY, cluster: process.env.MIX_PUSHER_APP_CLUSTER, wsHost: process.env.MIX_PUSHER_HOST, wsPort: process.env.MIX_PUSHER_PORT, forceTLS: process.env.MIX_PUSHER_USE_SSL === true || process.env.MIX_PUSHER_USE_SSL === 'true', disableStats: true, });
Nginx 反向代理配置
配置用途:适配站点SSL证书,转发Websockets请求
location /app/ { proxy_pass http://127.0.0.1:6001/app/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; } location /apps/ { proxy_pass http://127.0.0.1:6001/apps/; proxy_set_header Host $host; }
其他状态说明
websockets.php与broadcasting.php配置文件均保留默认值未做修改- 访问
/laravel-websockets路径下的Websockets面板,可通过443端口正常连接,也能查看到频道订阅记录
- 本地环境下事件触发时面板会出现如下
api-message相关记录:
- 生产环境无上述
api-message类记录,表现为可正常订阅频道但无法捕获api-message事件
排查修复指引
你遇到的可连接、可订阅但收不到事件、面板无api-message记录的问题,核心原因是后端服务没有把广播事件发送到你自建的Websockets服务,按以下顺序排查即可:
- 修正服务端Pusher配置
你当前.env中服务端的Pusher配置缺失自定义服务地址,默认会向Pusher官方服务器发送广播请求,根本不会到达你自己的6001端口服务。修改.env中对应配置如下:# 调整协议和SSL配置,匹配你443端口的HTTPS服务 PUSHER_SCHEME=https PUSHER_USE_SSL=true # 补全自建Websockets服务的域名和端口 PUSHER_HOST=mydomain.com PUSHER_PORT=443 - 清除生产环境缓存
生产环境默认开启配置缓存,修改.env后必须执行以下命令生效,如果你用队列异步处理广播,还需要重启队列进程:php artisan config:clear php artisan cache:clear php artisan queue:restart - 补全前端Echo配置
现有Echo配置缺少WSS端口和传输协议声明,部分浏览器环境下会出现连接正常但收不到消息的问题,调整配置如下,修改后重新执行npm run production编译前端资源:window.Echo = new Echo({ broadcaster: 'pusher', key: process.env.MIX_PUSHER_APP_KEY, cluster: process.env.MIX_PUSHER_APP_CLUSTER, wsHost: process.env.MIX_PUSHER_HOST, wsPort: process.env.MIX_PUSHER_PORT, wssPort: process.env.MIX_PUSHER_PORT, forceTLS: process.env.MIX_PUSHER_USE_SSL === true || process.env.MIX_PUSHER_USE_SSL === 'true', enabledTransports: ['ws', 'wss'], disableStats: true, }); - 验证服务运行状态
执行以下命令确认Websockets服务正常运行:- 检查6001端口是否被监听:
netstat -tulpn | grep 6001 - 如果用Supervisor维持Websockets进程,查看进程日志确认无报错
- 本地curl验证接口连通性:
curl -I http://127.0.0.1:6001/apps,返回非404/502状态码即为正常
- 检查6001端口是否被监听:
90%以上的同类问题都是第一步服务端地址漏配导致的,修正配置清缓存后即可在面板看到api-message记录,前端也能正常收到事件。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

