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

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端口正常连接,也能查看到频道订阅记录
    websockets subscribed to channels
  • 本地环境下事件触发时面板会出现如下api-message相关记录:
    websockets api-message
  • 生产环境无上述api-message类记录,表现为可正常订阅频道但无法捕获api-message事件
排查修复指引

你遇到的可连接、可订阅但收不到事件、面板无api-message记录的问题,核心原因是后端服务没有把广播事件发送到你自建的Websockets服务,按以下顺序排查即可:

  1. 修正服务端Pusher配置
    你当前.env中服务端的Pusher配置缺失自定义服务地址,默认会向Pusher官方服务器发送广播请求,根本不会到达你自己的6001端口服务。修改.env中对应配置如下:
    # 调整协议和SSL配置,匹配你443端口的HTTPS服务
    PUSHER_SCHEME=https
    PUSHER_USE_SSL=true
    # 补全自建Websockets服务的域名和端口
    PUSHER_HOST=mydomain.com
    PUSHER_PORT=443
    
  2. 清除生产环境缓存
    生产环境默认开启配置缓存,修改.env后必须执行以下命令生效,如果你用队列异步处理广播,还需要重启队列进程:
    php artisan config:clear
    php artisan cache:clear
    php artisan queue:restart
    
  3. 补全前端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,
    });
    
  4. 验证服务运行状态
    执行以下命令确认Websockets服务正常运行:
    • 检查6001端口是否被监听:netstat -tulpn | grep 6001
    • 如果用Supervisor维持Websockets进程,查看进程日志确认无报错
    • 本地curl验证接口连通性:curl -I http://127.0.0.1:6001/apps,返回非404/502状态码即为正常

90%以上的同类问题都是第一步服务端地址漏配导致的,修正配置清缓存后即可在面板看到api-message记录,前端也能正常收到事件。

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:42:17