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拦截的问题,可以加上。
最后测试连接
完成以上配置后,重新部署应用:
- 运行
eb deploy - SSH登录实例,用
ps aux | grep websocket确认服务在运行 - 查看日志
tail -f /var/log/websocket.out和tail -f /var/log/websocket.err,确认没有启动错误 - 访问
admin/websocket页面尝试连接,看是否解决了502错误
如果还是有问题,可以去AWS控制台的负载均衡页面查看访问日志和错误日志(日志存在S3里),从中找更具体的报错信息。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

