【问题标题】:Rails5 Action Cable Nginx 404 and 502 errorsRails Actioncable Nginx 404 和 502 错误
【发布时间】:2017-10-02 00:44:05
【问题描述】:

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

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

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

然后在 nginx 配置中添加以下位置 /cable 配置后,我开始收到 502 bad gateway 错误。

注意:我没有专门为 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;
    }

我在 location /cable 设置中尝试了各种 proxy_pass 选项,但都没有奏效。

【问题讨论】:

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


    【解决方案1】:

    每个人。 :)

    经过一周的奋斗、努力、不断地摆弄 nginx 和 puma 的配置文件,一遍遍地认真阅读博客,我终于找到了问题所在。

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

    workers 2
    daemonize true
    

    daemonize true:这告诉 puma 通过生成一个子进程并将其与正在执行的 shell 分离来在后台运行。如果不使用 daemonize,则需要通过 nohup 运行 puma 进程,并将其显式置于后台。

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

    【讨论】:

    • 好帖子,拯救我的一天!
    【解决方案2】:

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

    Rails 5.0.7

    红宝石 2.3.1p112

    好的。所以今天我想再次将 Action Cable 集成到我的项目中,但又遇到了同样的问题。我应用了上述解决方案,但没有奏效。上次虽然它有效,但我对解决方案不满意,认为为什么 ActionCable 会在本地机器上的单线程/worker 中工作。

    但这一次我集中注意力并找出了罪魁祸首。

    罪魁祸首是 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 集成,您需要遵循以下步骤:

    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 文件。这是我在 gist nginx.conf 中的完整 NGINX 配置。我用“example.com”替换了我的站点名称,用“example”替换了项目名称。因此,如果您要复制任何内容,请确保将其替换为您的内容,否则将无法正常工作,因为路径会被破坏。

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

    谢谢。

    【讨论】:

    • 您建议的配置(尤其是 /ws://*/ 和 /http://*/ 的东西)非常不安全,绝不应该驻留在任何生产环境中。在任何情况下,只有当 action-cable 服务器确实作为单独的实例运行时,才需要进行这些调整。
    • 我遇到了类似的问题,但看到它非常偶尔发生,我使用乘客和 nginx 作为反向代理,任何关于如何修复的帮助都会非常棒!
    猜你喜欢
    • 2017-09-06
    • 2015-05-21
    • 2011-11-25
    • 2021-01-20
    • 2019-05-03
    • 2014-12-14
    • 2014-01-30
    • 1970-01-01
    • 2020-10-17
    相关资源
    最近更新 更多