我有一个使用 Action Cable
进行 websocket 功能的 Rails 5 应用程序。
在我的开发环境中,一切都如预期工作,浏览器客户端成功连接到 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 环境相关设置:
config.action_cable.url = "ws://localhost:#{port}/cable"
生产环境相关设置:
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。
5.0.0.1
来解决它。 - Michael B