ActionCable 不再在生产环境中工作
Posted
技术标签:
【中文标题】ActionCable 不再在生产环境中工作【英文标题】:ActionCable no longer working in production environment 【发布时间】:2017-07-04 22:03:45 【问题描述】:我有一个 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
作为网络服务器。网络服务器为安装了有效证书的 SSL 连接提供服务。在生产机器上,Puma 在端口 3000
上为应用程序提供服务,但这会被转发到路由器中的端口 443
。
在我的开发机器上运行应用程序和生产的唯一显着区别是在生产中使用 SSL。
【问题讨论】:
您在使用 AWS 吗? @Shannon Nope,使用 Synology NAS 上的 docker 容器托管 由于缺乏代表,我无法对这个问题发表评论;你用什么来服务这个? nginx?阿帕奇?它与本地设置的production
一起工作的事实表明 Web 服务器配置存在问题。您正在运行什么 Docker 容器?您的 NAS 上正在运行什么操作系统?需要所有这些信息。
Puma 是所示的网络服务器。我将编辑帖子,包括更多信息。顺便说一句,这应该是对我帖子的评论,而不是答案
你的 redis 商店工作了吗?如果这就是您在生产中使用的。
【参考方案1】:
根据您的问题陈述
您的开发环境工作正常,因为您已将其设置为处理不安全的 Web 流量,但您的生产环境设置为处理安全流量。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
【讨论】:
你是对的,在我的开发机器上我没有使用 SSL。端口 443 被转发到 3000,所以应该没什么区别,对吧? 你需要在url中添加端口。您的托管服务器 puma 将负责控制流量。 好吧,让我试试,虽然两个端口之间的转发应该没有区别 只是为了让您知道 dis 并没有像预期的那样产生任何影响【参考方案2】:我现在可以安全地断定这是一个错误,可能在 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,现在有一个新版本可以解决此问题。
【讨论】:
在我的情况下,这是 AR 模型的错误记忆,因此没有为不同的聊天室加载相应的模型。 嗨,我在 Rails 5.2.0(使用 Puma 3.11)的生产环境中看到了同样的事情——我想知道你是否有时间解决这个问题? - 以及(如果您不介意分享)如何?以上是关于ActionCable 不再在生产环境中工作的主要内容,如果未能解决你的问题,请参考以下文章
BeforeRouteEnter 无法通过脚本设置在生产环境中工作