现在公司项目里加入了 ActionCable 组件,在本地环境中用 async 的方法能够正常启动;后来我在 Staging 环境中测试总是失败,刚刚解决了这个问题,因此发篇帖子记录一下。自己对其中内容有不理解的地方,社区各位大神也可以帮忙解答一下。 接下来,等功能开发完毕,会在配有 TLS 的正式服务上部署,如果有新的坑我会来更新。
在 Rails 中配置 ActionCable 并不难,只需要配置三部分:cable.yml
,staging.rb
,routes.rb
# config/cable.yml
development:
adapter: async
test:
adapter: async
production:
adapter: redis
url: redis://localhost:6379/3
staging:
adapter: redis
url: redis://localhost:6379/3
# config/environments/staging.rb
# ...
config.action_cable.url = 'ws://staging.xxx.cn/cable'
config.action_cable.allowed_request_origins = [ 'http://staging.xxx.cn' ]
# ...
# config/routes.rb
# ...
mount ActionCable.server => '/cable'
# ...
如果在 development 环境中,仅仅将adapter
配置为async
即可在本机上完成 ActionCable 的基本配置。
仅凭以上配置,在配置好 Nginx 和 Puma 的 Staging 环境中部署,会遇到一个 Error:
ERROR -- : Failed to upgrade to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
页面中 Console 里的表现是/cable
报 404。
查过很多方法之后,最终在网站的 nginx 配置文件里加上以下内容,问题得到解决:
location /cable {
proxy_pass http://xxx;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Proto http;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
}
目前尝试的结果是:不能
本机开发环境不配置 Nginx,所有请求都走 Rack,因此理论上需要在config/development.rb
中写出与以上 Nginx 配置作用相同的 Rack 配置,实践上我还没写出来,然而除非做研究学习否则也没有必要这样做。(如果有人感兴趣,可以尝试)
就先分享这么多。