无法在AWS Elastic Beanstalk部署Laravel Websockets求助
先从最基础的日志问题入手,你找不到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:serveweb是EB默认的Web进程,websocket是我们新增的WebSocket进程。 - 重新部署你的应用到EB,EB会自动帮你启动并维护这个WebSocket进程,不需要手动执行nohup。
3. 检查负载均衡器与安全组配置
502错误通常是负载均衡器无法连接到后端实例的6001端口导致的:
- 目标组配置:进入EC2控制台的“目标组”,找到EB为你的环境创建的目标组(通常名称包含你的环境名),确认目标组的“端口”设置为6001,并且目标实例的状态是“健康”。
- 安全组配置:
- EC2实例的安全组:要允许来自负载均衡器安全组的6001端口入站流量(或者暂时开放
0.0.0.0/0:6001来测试,测试通过后再限制来源)。 - 负载均衡器的安全组:要允许来自客户端的6001端口入站流量。
- EC2实例的安全组:要允许来自负载均衡器安全组的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

