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

无法在AWS Elastic Beanstalk部署Laravel Websockets求助

解决Laravel WebSocket在AWS Elastic Beanstalk上的502连接错误

先从最基础的日志问题入手,你找不到websocket.out和websocket.err是因为在Elastic Beanstalk环境中,手动执行nohup命令生成的文件默认在你执行命令的目录(通常是/var/app/current),不过更高效的方式是直接查看EB的系统日志:

  • 通过AWS控制台:进入你的Elastic Beanstalk环境,点击左侧的“日志”选项卡,选择“请求日志”->“最近的日志”下载查看,里面会包含所有应用和系统相关的日志,包括你的WebSocket进程输出。
  • 通过CLI命令:在本地终端执行eb logs,会自动拉取并显示环境的所有日志。

接下来针对你遇到的502握手错误,逐个排查可能的问题:

1. 确认WebSocket服务是否真的在运行

SSH到你的EC2实例(可以通过EB控制台的“实例”选项卡获取实例ID,再用SSH连接),执行以下命令检查进程:

ps aux | grep websocket

如果看不到php artisan websocket:serve的进程,说明服务没启动成功。此时可以直接在终端执行php artisan websocket:serve,看看是否有报错信息,比看nohup日志更直接。

2. 修复Elastic Beanstalk的进程管理方式

手动用nohup启动的服务在EB环境重启、实例扩容或部署新版本时会被终止,正确的做法是用EB的Procfile来管理WebSocket进程:

  • 在你的Laravel项目根目录创建Procfile文件(注意首字母大写),内容如下:
    web: vendor/bin/heroku-php-apache2 public/
    websocket: php artisan websocket:serve
    
    这里的web是EB默认的Web进程,websocket是我们新增的WebSocket进程。
  • 重新部署你的应用到EB,EB会自动帮你启动并维护这个WebSocket进程,不需要手动执行nohup。

3. 检查负载均衡器与安全组配置

502错误通常是负载均衡器无法连接到后端实例的6001端口导致的:

  • 目标组配置:进入EC2控制台的“目标组”,找到EB为你的环境创建的目标组(通常名称包含你的环境名),确认目标组的“端口”设置为6001,并且目标实例的状态是“健康”。
  • 安全组配置:
    • EC2实例的安全组:要允许来自负载均衡器安全组的6001端口入站流量(或者暂时开放0.0.0.0/0:6001来测试,测试通过后再限制来源)。
    • 负载均衡器的安全组:要允许来自客户端的6001端口入站流量。
  • 监听器配置:确认负载均衡器的6001端口监听器已经正确关联到上面的目标组。

4. 调整Laravel WebSocket的配置

你的config/broadcasting.php中的pusher配置可能需要调整:

  • 把options里的host改为127.0.0.1,因为WebSocket服务是在EC2实例本地运行的,负载均衡器会把请求转发到实例的6001端口,而前端应该连接负载均衡器的地址(比如ws://your-load-balancer-url:6001)。
  • 确保.env中的PUSHER_APP_KEY、PUSHER_APP_ID、PUSHER_APP_SECRET在本地和服务器上保持一致。

修改后的broadcasting.php的pusher部分:

'pusher' => [
    'driver' => 'pusher',
    'key' => env('PUSHER_APP_KEY'),
    'secret' => env('PUSHER_APP_SECRET'),
    'app_id' => env('PUSHER_APP_ID'),
    'options' => [
        'cluster' => env('PUSHER_APP_CLUSTER'),
        'encrypted' => false,
        'host' => '127.0.0.1',
        'port' => 6001,
        'scheme' => 'http'
    ],
],

5. 测试WebSocket连接

完成以上配置后,先在EC2实例本地测试连接:

curl http://127.0.0.1:6001/app/your-pusher-key?protocol=7&client=js&version=4.3.1

如果返回类似{"event":"pusher:connection_established","data":"{\"socket_id\":\"1234567890\",\"activity_timeout\":30}"}的内容,说明服务在本地是正常的,问题就在负载均衡或安全组上。

最后,重新部署应用,确保所有配置生效,再访问WebSocket Admin页面测试连接。

内容的提问来源于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:06:24