我有一个Rails 5应用程序,它使用Action Cable
来实现websocket功能。
在我的开发环境中,一切都按预期工作,浏览器客户端成功连接到Action Cable
频道。
在我的制作环境Action Cable
正在某个时刻工作,但突然停止运作,没有任何明显的原因。
如果我在开发计算机RAILS_ENV
上运行应用程序时将production
更改为Action Cable
,则可以正常工作。在实际生产机器上运行应用程序时似乎有些不同,尽管基本环境是相同的。
我在Chrome控制台中看到的具体错误:
mydomain.com/:1 WebSocket connection to 'wss://mydomain.com/cable' failed: WebSocket is closed before the connection is established
。我在其他浏览器中遇到类似的错误,因此它似乎与浏览器无关。我在测试时禁用了任何广告拦截器以确保它们不会干扰。
Development.rb ENV相关设置:
config.action_cable.url = "ws://localhost:#{port}/cable"
Production.rb ENV相关设置:
hostname = ENV.fetch('HOSTNAME')
port = ENV.fetch('PORT')
base_url = "#{hostname}:#{port}"
config.action_cable.url = "wss://#{hostname}/cable"
config.action_cable.allowed_request_origins = ["https://#{base_url}", "https://#{hostname}"]
我使用Puma
作为网络服务器。 Web服务器提供安装了有效证书的SSL连接。在生产机器上,Puma在端口3000
上提供应用程序,但这会转发到路由器中的端口443
。
在我的开发机器和生产环境中运行应用程序的唯一显着区别是使用生产SSL。
答案 0 :(得分:7)
我现在可以安全地断定这是一个错误,可能在Rails / ActionCable本身。其他报告证实了这一点,正如我曾经说过的那样,它工作得很好,这就是我使用Rails 5.0.0.1
的时候。当我更新为5.0.1
时,它已损坏并且在5.0.2
上仍然存在损坏。我正在Rails项目的GitHub issue tracker上打开一个问题。
编辑2017年7月:Rails确实改变了它对Rack套接字的读写方式,但是您使用的实际Web服务器软件需要支持这些非阻塞读写方法。在我的情况下,Puma当时没有,因此websockets不起作用。对于Puma,现在有一个新版本,解决了这个问题。
答案 1 :(得分:2)
根据您的问题陈述
Development.rb ENV相关设置:
config.action_cable.url = "ws://localhost:#{port}/cable"
Production.rb ENV相关设置:
config.action_cable.url = "wss://#{hostname}/cable"
根据您的网络设置,您已将SSL端口重定向配置为端口3000并从PUMA rb服务器提供Web请求。
现在我在这里看到的问题是wss://#{hostname}
会尝试在默认端口443上侦听安全流量而不是重定向端口3000