ActionCable不再在生产环境中工作

edw*_*dmp 23 ssl ruby-on-rails websocket puma actioncable

我有一个Rails 5应用程序,Action Cable用于websocket功能.

在我的开发环境中,一切都按预期工作,浏览器客户端成功连接到Action Cable通道.

在我的生产环境Action Cable中,某些时候正在工作,但突然停止运行,没有任何明显的原因.

如果我在我的开发机器上运行应用程序时更改RAILS_ENVproduction正常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"
Run Code Online (Sandbox Code Playgroud)

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}"]
Run Code Online (Sandbox Code Playgroud)

Puma用作网络服务器.Web服务器提供安装了有效证书的SSL连接.在生产机器上,Puma在端口上为应用程序提供服务,3000但这会转发到443路由器中的端口.

在我的开发机器和生产中运行应用程序的唯一显着区别是使用生产SSL.

edw*_*dmp 7

我现在可以安全地断定这是一个bug,可能在Rails/ActionCable本身.其他报告证实了这一点,正如我曾经说过的那样,它工作得很好,这就是我使用Rails的时候5.0.0.1.当我更新到5.0.1它破了,它仍然被打破5.0.2.我在Rails项目的GitHub 问题跟踪器上打开了一个问题.

编辑2017年7月:Rails确实改变了它如何读取和写入Rack套接字,但是您使用的实际Web服务器软件需要支持这些非阻塞读写方法.在我的情况下,Puma当时没有,因此websockets不起作用.对于Puma,现在有一个新版本,其中包含针对此问题的解决方法.

  • 嗨,我在 Rails 5.2.0(使用 Puma 3.11)上看到同样的事情 - 我想知道你是否有时间解决这个问题?- 和(如果你不介意分享)怎么样? (3认同)