Rails5 Action Cable Nginx 404和502错误

时间:2017-05-04 02:04:56

标签: ruby-on-rails nginx ruby-on-rails-5 puma actioncable

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

我第一次使用ActionCable,而在开发服务器上它运行正常。但在我使用Puma和Nginx的制作中,我面临着可怕的问题。

  

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

     

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

     

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

     

我需要一些专家来帮助我。我需要快速帮助才能解决问题。在此先感谢:)

我的环境/ 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;
    }

我在位置/电缆设置中尝试过各种proxy_pass选项,但都没有。

2 个答案:

答案 0 :(得分:2)

的所有人。 :)

经过一周的努力,努力工作并不断地使用nginx和puma配置文件并一次又一次地敏锐地阅读博客,我能够找出问题。

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

workers 2
daemonize true

daemonize true:这告诉puma通过生成子进程并从执行的shell中分离它来在后台运行。如果你不使用daemonize,你需要通过nohup运行puma进程并明确地将它放在后台。

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

答案 1 :(得分:2)

我用于此项目的RAILS和RUBY版本是

排名5.0.7

红宝石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”表示。

这是我在Action Server上实施ActionCable及其工作副本的摘要

因此要将Action Cable与Rails 5集成在一起,您需要执行以下步骤:

  1. 在默认端口上设置Redis。
  2. 根据您的应用程序环境,将这些行添加到environment / staging.rb或environment / production.rb中。

    config.action_cable.url = [/ ws:// * /,/ wss:// * /]

    config.action_cable.allowed_request_origins = [/ http:// * /,/ https:// * /]

  3. 最后如上所述设置您的NGINX文件。这是我在nginx.conf中的完整NGINX配置。我已将网站名称替换为“ example.com”,并将项目名称替换为“ example”。因此,如果您要复制任何内容,请确保将其替换为您的内容,否则将无效,因为路径将被破坏。

我希望这能真正缓解将ActionCable推向实时应用程序并为任何人解决此握手错误的麻烦,因为这是非常棘手和技术性的工作,许多文档只是提到将动作电缆指向您的主站点URL和不是在您的nginx后面运行的puma服务器。

谢谢。