生产环境Laravel-WebSockets连接始终Pending问题求助
生产环境WebSocket连接Pending问题排查与修复
核心问题分析
相同配置下之前项目正常,当前连接持续Pending,大概率是端口暴露/代理缺失、SSL证书不匹配、服务未正常运行或防火墙拦截导致。以下是逐一排查修复步骤:
1. 补全Nginx WebSocket代理配置
当前Nginx未配置WebSocket请求转发,直接访问6001端口易被拦截或触发SSL握手异常。在Nginx的server块中添加以下配置:
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 "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
修改后重启Nginx:systemctl restart nginx
2. 调整客户端连接地址
将原连接地址:
wss://mysite:6001/app/{key}
改为:
wss://mysite.com/app/{key}
(无需携带6001端口,由Nginx自动转发)
3. 检查SSL证书匹配性
.env中证书路径指向www.domain,但server_name是mysite.com,需确认证书文件属于mysite.com:
- 替换.env中的证书路径为对应
mysite.com的证书路径,例如:LARAVEL_WEBSOCKETS_SSL_LOCAL_CERT=/www/server/panel/vhost/cert/mysite.com/fullchain.pem LARAVEL_WEBSOCKETS_SSL_LOCAL_PK=/www/server/panel/vhost/cert/mysite.com/privkey.pem - 重启Laravel WebSockets服务生效
4. 确保WebSockets服务后台运行
直接运行php artisan websockets:serve仅能临时启动服务,生产环境需用进程管理器托管(以supervisor为例):
- 创建supervisor配置文件
/etc/supervisor/conf.d/laravel-websockets.conf:[program:laravel-websockets] process_name=%(program_name)s_%(process_num)02d command=php /www/wwwroot/mysite.com/artisan websockets:serve autostart=true autorestart=true user=www numprocs=1 redirect_stderr=true stdout_logfile=/www/wwwroot/mysite.com/storage/logs/websockets.log - 更新并启动服务:
supervisorctl reread supervisorctl update supervisorctl start laravel-websockets:*
5. 验证广播驱动配置
确保.env中广播驱动设置正确:
BROADCAST_DRIVER=pusher
当前broadcasting.php默认值为null,需显式设置为pusher才能启用WebSockets广播。
6. 防火墙/安全组检查
- 若使用Nginx代理,仅需开放服务器80/443端口,6001端口仅需允许本地访问(Nginx转发时用127.0.0.1)
- 若直接暴露6001端口,需在服务器防火墙(如ufw)和云服务商安全组中开放6001端口的TCP访问
7. 测试连接有效性
用curl测试WebSocket握手:
curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Host: mysite.com" -H "Origin: https://mysite.com" -H "Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==" -H "Sec-WebSocket-Version: 13" https://mysite.com/app/test?protocol=7&client=js&version=7.4.0&flash=false
返回101 Switching Protocols则连接正常,否则查看服务器日志定位具体错误。
内容的提问来源于stack exchange,提问作者Мохамед Русланович
相关产品推荐
相关产品推荐

