Rails 7 Action Cable在Puma、Nginx、Docker Swarm环境下连接失败求助
问题修复方案:Action Cable WebSocket连接失败
你的WebSocket连接失败核心原因是Nginx未配置WebSocket协议的反向代理规则,默认的HTTP代理无法处理WebSocket的握手升级请求。以下是具体修复步骤:
1. 修改Nginx配置,添加WebSocket代理规则
更新/etc/nginx/sites-available/mydomain.com配置,为/cable路径添加专门的WebSocket处理规则:
server { server_name mydomain.com www.mydomain.com; location / { proxy_pass http://127.0.0.1:3000; include proxy_params; } # 新增Action Cable WebSocket代理配置 location /cable { proxy_pass http://127.0.0.1:3000; include proxy_params; # 启用HTTP/1.1以支持WebSocket握手 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 设置长连接超时,避免Nginx主动断开WebSocket连接 proxy_read_timeout 86400; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = www.mydomain.com) { return 301 https://$host$request_uri; } # managed by Certbot if ($host = mydomain.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; listen [::]:80; server_name mydomain.com www.mydomain.com; return 404; # managed by Certbot }
修改后验证配置并重启Nginx:
sudo nginx -t sudo systemctl restart nginx
2. 检查Rails生产环境Action Cable配置
确保config/environments/production.rb中设置了正确的允许请求来源:
Rails.application.configure do # 其他配置... # 允许主域名和www子域名的WebSocket请求 config.action_cable.allowed_request_origins = [/https?:\/\/(www\.)?mydomain\.com/] end
3. 验证Docker Swarm服务状态
- 检查web服务是否正常运行:
docker service ls - 验证Redis连接可用性:进入web容器执行以下命令,确认返回
PONG:docker exec -it <web_container_id> redis-cli -h redis ping - 确认
.env.production.local中的REDIS_URL设置为redis://redis:6379
4. 额外排查点
- 检查服务器防火墙是否开放443端口(HTTPS/WebSocket默认端口)
- 查看浏览器控制台的具体错误类型:
- 403错误:检查
allowed_request_origins配置是否匹配域名 - 502错误:确认web服务正常监听3000端口,或Nginx与后端连接异常
- 超时错误:排查防火墙规则、Docker网络是否存在拦截
- 403错误:检查
内容的提问来源于stack exchange,提问作者user3612719
相关产品推荐
相关产品推荐

