Rails6+Nginx+Phusion Passenger6.0.4环境Hotwire WebSocket连接失败求助
问题根因&解决方案
你遇到的问题是两个独立错误叠加导致的,按优先级修复即可:
1. 网关Nginx配置笔误(直接导致请求转发失败)
你网关层nginx.conf的/cable路径配置中,proxy_pass指向的http://active_migration上游服务并未定义,所有WebSocket请求根本没有转发到正确的应用服务器。
修复方式:
把网关nginx.conf中location /cable块的配置改为:
location /cable { proxy_pass http://myapp; 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-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
修改后执行nginx -s reload重载配置生效。
2. Ruby和Rails版本不兼容(导致参数报错)
你使用的Rails 6.0.3.5版本没有适配Ruby 3.0.0的关键字参数传递规则,Action Cable底层处理WebSocket请求的方法调用会触发参数数量不匹配的报错。
修复方式二选一:
- 方案A:将Ruby版本降级到2.7.x系列,Rails 6.0.3.5对Ruby2.7的兼容性是完整的
- 方案B:将Rails版本升级到6.0.4以上的6.0.x最新版本,或者直接升级到6.1.x系列,高版本已经修复了Ruby3的关键字参数兼容问题
3. 可选优化(规避Passenger兼容问题)
你当前使用的Phusion Passenger 6.0.4对Ruby3的WebSocket处理也存在已知bug,建议升级到6.0.12及以上版本,避免额外的兼容问题。
所有配置调整完成后重启应用服务,清理浏览器缓存重新访问即可解决问题。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

