You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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网络是否存在拦截

内容的提问来源于stack exchange,提问作者user3612719

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:02:33