【问题标题】:Rails6 + Nginx + Passenger + ActionCable = websocket is closedRails6 + Nginx + Passenger + ActionCable = websocket 已关闭
【发布时间】:2021-01-02 06:01:56
【问题描述】:

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
  • Rails 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.

【问题讨论】:

    标签: ruby-on-rails nginx websocket actioncable


    【解决方案1】:

    能否请您在您的 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.
    

    为什么在生产中而不是在开发中需要这个没有解释或清楚。

    【讨论】:

    • meta_tag 方法将在您的布局中添加 并在您的布局中提供操作电缆 URL
    • 好的 - 但我想我在问这是做什么的,因为在开发环境中这是不需要的,而且即使没有该标签,我也可以看到该站点访问服务器。如果需要,为什么不在 Rails 代码中的某处提到启用了 actioncable 的默认生成应用程序!
    • 是的,它有效,但答案需要解释它为什么有效。
    • 在 Rails 文档中提到:guides.rubyonrails.org/… 希望这能回答您的问题。
    • 另外,你能把这个问题标记为可用和正确吗?所以它也会帮助其他用户
    猜你喜欢
    • 2021-12-14
    • 2019-09-23
    • 2017-01-10
    • 1970-01-01
    • 2018-10-12
    • 2011-12-22
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    相关资源
    最近更新 更多