edw*_*dmp 23 ssl ruby-on-rails 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"
Run Code Online (Sandbox Code Playgroud)
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}"]
Run Code Online (Sandbox Code Playgroud)
我Puma用作网络服务器.Web服务器提供安装了有效证书的SSL连接.在生产机器上,Puma在端口上为应用程序提供服务,3000但这会转发到443路由器中的端口.
在我的开发机器和生产中运行应用程序的唯一显着区别是使用生产SSL.
我现在可以安全地断定这是一个bug,可能在Rails/ActionCable本身.其他报告证实了这一点,正如我曾经说过的那样,它工作得很好,这就是我使用Rails的时候5.0.0.1.当我更新到5.0.1它破了,它仍然被打破5.0.2.我在Rails项目的GitHub 问题跟踪器上打开了一个问题.
编辑2017年7月:Rails确实改变了它如何读取和写入Rack套接字,但是您使用的实际Web服务器软件需要支持这些非阻塞读写方法.在我的情况下,Puma当时没有,因此websockets不起作用.对于Puma,现在有一个新版本,其中包含针对此问题的解决方法.
| 归档时间: |
|
| 查看次数: |
2932 次 |
| 最近记录: |