Rails6 + Nginx +乘客+ ActionCable = websocket已关闭

问题描述

关于Rails 5,有一个类似的问题-未回答-,但是,当我使用Rails 6时,我再次询问。

在生产环境中操作动作电缆时遇到一些麻烦。 开发环境运行正常。

解决错误WebSocket connection to 'wss://myapp.com/cable' Failed: WebSocket is closed before the connection is established.

我在Chrome的控制台上多次遇到此错误

堆栈

  • Ruby 2.6.5
  • 导轨6.0.3.2
  • Nginx 1.14.0

Nginx.conf

server {
listen 443 ssl;

  server_name *.myapp.com;
ssl_certificate /etc/letsencrypt/live/myapp.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/myapp.com/privkey.pem;

  root /home/deploy/myapp/current/public;

  passenger_enabled on;
  passenger_app_env production;

  location /cable {
    passenger_app_group_name myapp_websocket;
    passenger_force_max_concurrent_requests_per_process 0;
  }

  # Allow uploads up to 100MB in size
  client_max_body_size 100m;

  location ~ ^/(assets|packs) {
    expires max;
    gzip_static on;
  }
}

cable.yml

development:
  adapter: redis

test:
  adapter: test

production:
  adapter: redis
  url: <%= ENV.fetch("REdis_URL") { "redis://localhost:6379/1" } %>
  channel_prefix: myapp_production

production.rb

  config.action_cable.url = 'wss://app.myapp.com/cable'
  config.action_cable.allowed_request_origins = [ 'https://app.myapp.com' ]

这些行在日志中不断重复: log / production.log

I,[2020-09-15T13:05:02.679580 #32158]  INFO -- : Finished "/cable/" [WebSocket] for xxx.xxx.133.88 at 2020-09-15 13:05:02 +0000
I,[2020-09-15T13:05:03.791781 #32158]  INFO -- : [2c7c3ddf-e0d9-4f6b-80d5-ace193462c8a] Started GET "/cable" for xxx.xxx.133.88 at 2020-09-15 13:05:03 +0000
I,[2020-09-15T13:05:03.792248 #32158]  INFO -- : [2c7c3ddf-e0d9-4f6b-80d5-ace193462c8a] Started GET "/cable/" [WebSocket] for xxx.xxx.133.88 at 2020-09-15 13:05:03 +0000
I,[2020-09-15T13:05:03.792320 #32158]  INFO -- : [2c7c3ddf-e0d9-4f6b-80d5-ace193462c8a] Successfully upgraded to WebSocket (REQUEST_METHOD: GET,HTTP_CONNECTION: upgrade,HTTP_UPG

浏览器控制台

WebSocket connection to 'wss://app.myapp.com/cable' Failed: WebSocket is closed before the connection is established.

解决方法

能否请您在production.rb中注释此行

config.action_cable.url = 'wss://app.myapp.com/cable'

另外,请确保视图布局文件中的这一行的默认名称为application.html.erb。

将此添加到头部。

<%= action_cable_meta_tag %>

Documentation指出:

8.3 Consumer Configuration

To configure the URL,add a call to action_cable_meta_tag in your HTML layout HEAD. This uses a URL or path typically set via config.action_cable.url in the environment configuration files.

为什么在生产中需要这样做,而没有开发却没有解释或清楚。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...