ActionCable不再在生产环境中工作

时间:2017-02-16 01:06:41

标签: ruby-on-rails ssl websocket puma actioncable

我有一个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。

2 个答案:

答案 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