ActionCable Rails 5 (Passenger) - 失败:WebSocket 握手期间出错:意外响应代码:404

Posted

技术标签:

【中文标题】ActionCable Rails 5 (Passenger) - 失败:WebSocket 握手期间出错:意外响应代码:404【英文标题】:ActionCable Rails 5 (Passenger) - failed: Error during WebSocket handshake: Unexpected response code: 404 【发布时间】:2018-09-04 23:34:32 【问题描述】:

我正在尝试将 ActionCable 和 Rails 5 部署到生产服务器 (DigitalOcean)。我已按照 Gorails 视频中提到的所有步骤操作:https://gorails.com/episodes/deploy-actioncable-and-rails-5

该应用是使用 Phusion Passenger + nginx + Capistrano 部署的。

当我尝试在生产中检查我的网站时,我在浏览器的控制台上收到了这个错误:

WebSocket connection to 'ws://139.59.175.34/cable' failed: Error during WebSocket handshake: Unexpected response code: 404

这些是我的设置:

/etc/nginx/sites-enabled/default

server 
        listen 80;
        listen [::]:80 ipv6only=on;

        server_name my_server_domain;
        passenger_enabled on;
        rails_env    production;
        root         /home/deploy/my_app_domain/current/public;

        # ActionCabel config (disable this if u r not using it)
        location /cable 
           passenger_app_group_name actioncable_websocket;
           passenger_force_max_concurrent_requests_per_process 0;
        

        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html 
            root   html;
        

production.rb

config.action_cable.url = "/cable"
config.action_cable.allowed_request_origins = ["http://139.59.175.34"]

cable.js

(function() 
  this.App || (this.App = );

  App.cable = ActionCable.createConsumer("/cable");

).call(this);

我已尝试将 config/production.rb 上的 ActionCable 配置更改为:

  config.action_cable.url = [/ws:\/\/*/, /wss:\/\/*/]
  config.action_cable.allowed_request_origins = [/http:\/\/*/, /https:\/\/*/]

但还是没有运气。


我还查看了服务器上的 production.log,这是记录的错误:

WebSocket error occurred: One or more reserved bits are on: reserved1 = 1, reserved2 = 0, reserved3 = 0

更新:

以下是服务器上的防火墙设置:

【问题讨论】:

什么是操作系统?你检查过防火墙吗?看起来套接字位已被另一个正在运行的软件保留。 @Erowlin 操作系统是 Linux 18.04。是的,防火墙处于非活动状态。请参考我上面帖子中的更新。 【参考方案1】:

您的配置看起来正确。

如果您正在运行防火墙,则可能会发生此问题。

检查您的 iptables 配置 (linux) 是否有阻止它(不过我没有特定的代码行可以提供给您)。

如果您使用的是 Windows,请检查是否没有“防病毒”或“防火墙”拦截/阻止这些位。我听说 Node32 是一个非常好的阻止 websockets 的候选者。

更新:您也可以尝试使用 wss://139.59.175.34/cable 而不是 ws://139.59.175.34/cable 进行连接吗? (确保您的 NGinx 使用 SSL 代理)。 https://docs.nginx.com/nginx/admin-guide/security-controls/securing-http-traffic-upstream/

【讨论】:

操作系统为Linux 18.04。并且防火墙处于非活动状态。请参阅我上面帖子中的更新。我也试过用 SSL 设置,同样的,它不起作用。 @RizalYusoff 我现在不知道。如果我有更多,我会回到这个。【参考方案2】:

我终于找到了问题的答案。事实证明,我的生产服务器上没有安装 redis。所以我只需要安装 redis,现在一切正常!

要检查服务器上是否安装了redis,请使用以下命令:

redis-cli

如果出现了 redis 控制台,那么你就准备好了。如果出现错误/警告,您可以按照以下步骤安装和运行 redis:

    sudo apt install redis-server redis-server

希望对你有帮助!

【讨论】:

知道如何在heroku上安装它吗?

以上是关于ActionCable Rails 5 (Passenger) - 失败:WebSocket 握手期间出错:意外响应代码:404的主要内容,如果未能解决你的问题,请参考以下文章

Rails 5.1 - ActionCable没有更新?

ActionCable Rails 5 (Passenger) - 失败:WebSocket 握手期间出错:意外响应代码:404

如何在 ActionCable rails-5-api 应用程序中获取 current_user?

使用 AWS Elastic Beanstalk 部署 Rails ActionCable

Rails 4 和 ActionCable

在 Rails 中的控制台无法使用 Actioncable 广播