ActionCable在生产环境中不再工作

27

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


1
你在使用 AWS 吗? - Shannon
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - edwardmp
你的 Redis 存储是否正常工作?如果你正在生产环境中使用它的话。 - Amin Shah Gilani
我在生产环境中使用ActionCable时遇到了问题。出于我的沮丧,我想提出一个想法。听起来生产服务器的配置有误。您是否将主机设置为生产服务器?这对我来说是个问题。如果有帮助,请查看我的文件内容。祝好运!https://walshcostigan.wordpress.com/2017/02/20/instant-chat-with-actioncable5-on-heroku/ - gwalshington
在puma-git上有一个类似的问题:https://github.com/puma/puma/issues/1189 这个人通过降级到Rails 5.0.0.1来解决它。 - Michael B
显示剩余2条评论
2个回答

8
我可以安全地得出结论,这很可能是一个错误,可能在Rails/ActionCable本身。其他报告也证实了这一点,正如我曾经说过的,在我使用Rails 5.0.0.1时,它可以正常工作。当我更新到5.0.1时,它就崩溃了,并且在5.0.2上仍然无法正常运行。我正在GitHub Rails项目的问题跟踪器上开一个问题。
编辑于2017年7月:Rails确实更改了读写Rack套接字的方式,但您使用的实际Web服务器软件需要支持这些非阻塞读写方法。在我的情况下,Puma当时没有支持,因此Websockets无法正常工作。对于Puma,现在有一个新版本来解决此问题。

在我的情况下,这是AR模型的错误记忆化,因此相应的模型未被加载到不同的聊天室中。 - elquimista
3
你好,我在Rails 5.2.0(使用Puma 3.11)的生产环境中也遇到了相同的问题。我想知道你是否解决了这个问题?如果可以分享的话,你是如何解决的? - walt_die

2

根据您的问题陈述

  • 您的开发环境可以正常工作,因为您已经设置它处理不安全的Web流量,但是在生产环境中设置了处理安全流量。

与Development.rb ENV相关的设置:

config.action_cable.url = "ws://localhost:#{port}/cable"

Production.rb环境相关设置:

 config.action_cable.url = "wss://#{hostname}/cable"  

根据您的网络设置,您已将SSL端口重定向到端口3000,并从PUMA rb服务器提供Web请求。
现在我在这里看到的问题是 wss://#{hostname} 将尝试侦听默认端口443以获取安全流量,而不是您重定向的端口3000。

你是正确的,在我的开发机上我没有使用 SSL。端口 443 被转发到 3000,所以这不应该有任何影响,对吧? - edwardmp
你需要在URL中添加端口。你的托管服务器Puma将负责处理流量操作。 - Mandar
好的,让我试一下,虽然由于两个端口之间的转发应该没有区别。 - edwardmp
只是想让您知道,这并没有像预期的那样产生任何影响。 - edwardmp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接