【发布时间】: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 商店工作了吗?如果这就是您在生产中使用的。
标签: ruby-on-rails ssl websocket puma actioncable