Ruby on Rails配合Puma、Nginx环境WebSocket连接失败排查求助
排查思路
- 优先查看Nginx错误日志,执行
cat /var/log/nginx/error.log,筛选/cable相关的请求记录,确认请求在Nginx层的返回状态码:- 如果状态码为401,说明是基础身份验证拦截了请求
- 如果状态码为502/503,说明请求转发到Puma失败,检查Puma服务运行状态和socket路径是否正确
- 用curl直接测试WebSocket相关接口,执行
curl -I https://upgrade.mysite.com/cable,验证Nginx层的请求拦截逻辑 - 查看Rails对应环境日志,路径为
/home/myuser/mysite/current/log/[环境名].log,确认是否有/cable请求进入应用层,若存在报错可直接定位到Rails配置问题 - 检查Rails Action Cable相关配置,确认允许的请求源、适配器配置是否和预发布环境一致
解决方案
1. 修复Nginx /cable配置
你当前的配置遗漏了两个核心配置项:关闭/cable路径的基础身份验证、传递请求协议头,修正后的location块如下:
location /cable { auth_basic off; proxy_pass http://app; proxy_http_version 1.1; proxy_set_header Upgrade websocket; proxy_set_header Connection "upgrade"; 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; proxy_set_header Host $http_host; proxy_read_timeout 86400; # 可选,避免长连接被主动断开 }
如果需要保留/cable路径的身份验证,可将Basic Auth凭证拼接在连接地址中,格式为wss://{用户名}:{密码}@upgrade.mysite.com/cable,该方案不建议生产环境使用,存在凭证泄露风险。
2. 修复Rails Action Cable配置
- 打开对应环境的配置文件
config/environments/[环境名].rb,添加如下配置:
# 替换为你实际的站点域名 config.action_cable.allowed_request_origins = ['https://upgrade.mysite.com'] config.action_cable.url = 'wss://upgrade.mysite.com/cable'
- 检查
config/cable.yml,生产/独立环境必须使用支持多进程的适配器,推荐用Redis,示例配置:
production: adapter: redis url: redis://localhost:6379/1 # 替换为你实际的Redis连接地址
3. 重启服务生效
配置修改完成后执行以下命令重启服务:
# 重启Nginx sudo systemctl restart nginx # 重启Puma,若使用Capistrano部署可执行 cap [环境名] deploy:restart 替代 sudo systemctl restart puma
内容的提问来源于stack exchange,提问作者Semen Shekhovtsov
相关产品推荐
相关产品推荐

