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

AWS Elastic Beanstalk部署BeyondCode Laravel WebSocket失败求助

解决AWS Elastic Beanstalk上Laravel WebSocket连接502错误的实用步骤

我来帮你一步步排查解决这个问题——我之前在部署Laravel WebSocket到EB时也踩过类似的坑,咱们从最基础的点开始检查:

先确认WebSocket服务是否真的在运行,找到日志文件

你用nohup启动服务,但首先得确认进程真的起来了,还要找到日志看具体错误:

  • 先通过EB CLI的eb ssh或者AWS控制台的EC2页面SSH登录到你的EB实例
  • 运行ps aux | grep websocket,看看php artisan websocket:serve这个进程是否存在。如果没找到,说明服务没启动成功
  • 关于日志:你执行启动命令的默认目录是/var/app/current,所以先去这个目录下找websocket.out和websocket.err,用cat websocket.out或者tail -f websocket.err查看启动日志里的报错。要是找不到,大概率是服务没启动起来,或者你启动命令的目录不对。

检查安全组和负载均衡的核心配置

502错误最常见的原因就是负载均衡没法连上EC2实例的6001端口,这部分一定要仔细核对:

  • 安全组:确保你的EC2实例安全组允许来自负载均衡安全组的6001端口TCP流量;同时负载均衡的安全组要允许外部(或者你的前端域名)访问6001端口
  • 负载均衡监听器:你已经加了6001端口的监听器,但要确认协议是TCP(WebSocket基于TCP,别用HTTP/HTTPS监听器,ALB的HTTP监听器虽然支持WebSocket,但直接用TCP监听器更稳妥)
  • 目标组:负载均衡的目标组要正确关联你的EC2实例,而且健康检查得正常。如果目标组健康检查失败,负载均衡会把实例标记为不可用,直接返回502。这里建议健康检查用你的Laravel应用的80/443端口(比如检查/路径),因为Laravel WebSocket本身没有默认的健康端点。

修正Laravel WebSocket的配置细节

你的config/broadcasting.php里有几个配置得调整:

  • 如果你用的是EB的负载均衡,host应该填负载均衡的域名,而不是backend.example.com(除非这个域名指向你的负载均衡)——因为前端是先连负载均衡,再由负载均衡转发到EC2实例的6001端口
  • 哪怕你设了APP_MODE=local,部署到EB其实是生产环境,建议开启encrypted为true,用wss://协议,避免浏览器的安全限制,也更安全
  • 修改后的pusher配置示例:
'options' => [
    'cluster' => env('PUSHER_APP_CLUSTER'),
    'encrypted' => true,
    'host' => env('LOAD_BALANCER_DOMAIN'), // 替换成你的负载均衡域名
    'port' => 6001,
    'scheme' => 'https'
],

前端的Echo配置也要对应改成:

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    wsHost: process.env.MIX_PUSHER_HOST, // 同样填负载均衡域名
    wsPort: 6001,
    wssPort: 6001,
    forceTLS: true,
    disableStats: true,
    enabledTransports: ['ws', 'wss']
});

让WebSocket服务在EB实例重启后自动运行

你现在手动用nohup启动,EB实例重启后服务就没了,得配置EB自动启动:

  • 在项目根目录创建.ebextensions/websockets.config文件,内容如下:
container_commands:
  01_stop_websockets:
    command: "pkill -f 'php artisan websocket:serve' || true"
  02_start_websockets:
    command: "nohup php artisan websocket:serve > /var/log/websocket.out 2> /var/log/websocket.err < /dev/null &"
    leader_only: false

这样每次部署或者实例重启,都会自动启停WebSocket服务,而且日志写到/var/log/目录,权限足够也不容易丢失。

检查Nginx配置(如果EB用的是Nginx环境)

如果你的EB环境是Nginx,默认配置可能会拦截WebSocket连接,需要加个配置支持:

  • 创建.ebextensions/nginx.config文件:
files:
  "/etc/nginx/conf.d/websocket.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      map $http_upgrade $connection_upgrade {
          default upgrade;
          '' close;
      }

      server {
          listen 80;
          server_name localhost;

          location /app {
              proxy_pass http://127.0.0.1:6001;
              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection $connection_upgrade;
              proxy_set_header Host $host;
          }
      }

这个是针对用80/443端口转发WebSocket的情况,如果你直接用6001端口,可能不需要,但如果遇到Nginx拦截的问题,可以加上。

最后测试连接

完成以上配置后,重新部署应用:

  1. 运行eb deploy
  2. SSH登录实例,用ps aux | grep websocket确认服务在运行
  3. 查看日志tail -f /var/log/websocket.out和tail -f /var/log/websocket.err,确认没有启动错误
  4. 访问admin/websocket页面尝试连接,看是否解决了502错误

如果还是有问题,可以去AWS控制台的负载均衡页面查看访问日志和错误日志(日志存在S3里),从中找更具体的报错信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:12:44