Ruby on rails Rails5行动电缆Nginx 404和502错误

Ruby on rails Rails5行动电缆Nginx 404和502错误,ruby-on-rails,nginx,ruby-on-rails-5,puma,actioncable,Ruby On Rails,Nginx,Ruby On Rails 5,Puma,Actioncable,每个人:)。 我知道人们已经面临很多与我有关的问题。我已经试过了,但我的问题还没有解决。我从过去三天一直在努力解决这个问题,但我无法做到这一点 我第一次使用ActionCable,在开发服务器上它运行良好。但在我使用Puma和Nginx的生产中,我面临着可怕的问题 最初,当我在nginx配置中没有(位置/电缆)设置时,服务器给了我404握手错误 i、 WebSocket握手期间出错:意外响应代码:404 然后在nginx配置中添加以下位置/电缆配置后,我开始收到502坏网关错误 注意:我没有专门

每个人:)。 我知道人们已经面临很多与我有关的问题。我已经试过了,但我的问题还没有解决。我从过去三天一直在努力解决这个问题,但我无法做到这一点

我第一次使用ActionCable,在开发服务器上它运行良好。但在我使用Puma和Nginx的生产中,我面临着可怕的问题

最初,当我在nginx配置中没有(位置/电缆)设置时,服务器给了我404握手错误
i、 WebSocket握手期间出错:意外响应代码:404

然后在nginx配置中添加以下位置/电缆配置后,我开始收到502坏网关错误

注意:我没有专门为ActionCable打开任何端口。我想这不是必须的。我的服务器上只有端口80打开。

我需要一些专家来帮我。我需要快速的帮助把它修好。提前感谢:)

我的environment/production.rb中有这两行代码

config.action_cable.url = "ws://my_linode_domain/cable"
config.action_cable.allowed_request_origins = [/http:\/\/*/, /https:\/\/*/]
这是我的nginx配置文件

    upstream app {
      # Path to Puma SOCK file, as defined previously
      server unix:/home/deploy/artcrate/shared/tmp/sockets/puma.sock fail_timeout=0;
    }

    server {
      listen 80;
      #server_name localhost;
      server_name my_linode_domain

     # prevents 502 bad gateway error
     large_client_header_buffers 8 32k;

      root /home/deploy/artcrate/current/public;

      try_files $uri/index.html $uri @app;

      location / {
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Connection '';
        proxy_pass http://app;
      }
      location ~ ^/(assets|fonts|system)/|favicon.ico|robots.txt {
        gzip_static on;
        expires max;
        add_header Cache-Control public;
      }
    location /cable{
       proxy_pass http://app;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "Upgrade";
     }

      error_page 500 502 503 504 /500.html;
      client_max_body_size 4G;
      keepalive_timeout 10;
    }
我在位置/电缆设置中尝试了各种代理通行证选项,但均无效。每个人:)

经过一周的奋斗、努力工作和不断玩弄nginx和puma配置文件,以及一次又一次地阅读博客,我终于找到了问题所在

我的nginx配置是正确的。我不得不在puma.rb配置中再添加两行,这两行没有默认配置。这两条线是:

workers 2
daemonize true
daemonize true:这告诉puma通过生成子进程并将其从执行shell中分离出来,在后台运行。如果不使用daemonize,则需要通过nohup运行puma进程,并将其显式地放在后台


我不确定是否需要工人2,但我在解决问题时添加了他们。所以我把它放在那里。但是在添加了以上两行之后,我的ActionCable开始正常工作。

我在这个项目中使用的RAILS和RUBY版本是

Rails 5.0.7

ruby 2.3.1p112

嗯。所以今天我想在我的项目中再次整合Action Cable,但又面临同样的问题。我应用了我的上述解决方案,但它不起作用。上一次虽然它工作了,但我不满意这个解决方案,因为我认为为什么ActionCable可以在本地机器上的单线程/工作线程中工作

但这次我集中精力找出了罪魁祸首

罪魁祸首是NGINX配置

当我面临404握手错误时的配置

location /cable {
proxy_pass http://example.com;
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection Upgrade;
}

配置时,一切都开始正常工作

location /cable {
proxy_pass http://puma;
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection Upgrade;
}

因此,罪魁祸首是:

proxy_pass http://example.com;
这里我们将它指向NGINX,这是错误的,它应该指向我们的puma服务器路径,在我的配置中,它由“puma”表示

以下是我在生产服务器上实施ActionCable及其工作副本的总结

因此,要将Action Cable与Rails 5集成,您需要遵循以下步骤:

  • 在默认端口上安装Redis
  • 根据您的应用程序环境,在environments/staging.rb或environments/production.rb中添加这些行

    config.action\u cable.url=[/ws://*/,/wss://*/]

    config.action\u cable.allowed\u request\u origins=[/http://*/,/https://*/]

  • 最后,按照上面的说明设置NGINX文件。这是我在gist中完整的NGINX配置。我用“example.com”替换了我的网站名,用“example”替换了项目名。因此,如果您要复制任何内容,请确保用您的内容替换这些内容,否则任何内容都无法正常工作,因为路径将被破坏

  • 我希望这将真正缓解将ActionCable推到live应用程序时的痛苦,并为任何人解决此握手错误,因为这是一件非常棘手和技术性的事情,很多文档只提到将ActionCable指向您的主站点url,而不是运行在nginx后面的puma服务器


    谢谢。

    这篇文章写得不错,帮了我的忙!您建议的配置(尤其是/ws://*/和/http://*/之类的配置)非常不安全,不应驻留在任何生产环境中。在任何情况下,只有在action cable服务器作为一个单独的实例运行时才需要进行这些调整。我面临着类似的问题,但看到它偶尔发生,我使用passenger和nginx作为反向代理,任何关于如何修复的帮助都将非常棒!