我有一个使用Action Cable的websocket功能的Rails 5应用程序。

在我的开发环境中,一切正常,浏览器客户端成功连接到Action Cable通道。

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

如果在开发计算机上运行应用程序时将RAILS_ENV更改为productionAction Cable可以正常工作。尽管基本环境相同,但在实际生产机器上运行应用程序时似乎有所不同。

我在Chrome控制台中看到的特定错误:
mydomain.com/:1 WebSocket connection to 'wss://mydomain.com/cable' failed: WebSocket is closed before the connection is established。我在其他浏览器中遇到了类似的错误,因此它似乎与浏览器无关。我在测试时禁用了所有adblocker,以确保它们不会干扰。

与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。

最佳答案

我现在可以安全地断定这是一个错误,可能是在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,现在有一个新版本,其中包含解决此问题的方法。

关于ruby-on-rails - ActionCable不再在生产环境中工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42263023/

10-11 17:41