【问题标题】:Rails application deployed on Elastic Beanstalk with Puma fails - 502 errors on every request使用 Puma 在 Elastic Beanstalk 上部署的 Rails 应用程序失败 - 每个请求都出现 502 错误
【发布时间】:2015-08-02 01:10:10
【问题描述】:

我刚刚将一个 Rails 应用程序部署到 Elastic Beanstalk,每个请求都给我一个 502 错误。

这是 /var/logs/nginx/error.log 的内容

2015/05/20 16:24:25 [warn] 1535#0: conflicting server name "localhost" on 0.0.0.0:80, ignored
2015/05/20 16:27:12 [crit] 1537#0: *20 connect() to unix:///var/run/puma/my_app.sock failed (2: No such file or directory) while connecting to upstream, client: 172.31.51.94, server: _, request: "POST /get HTTP/1.1", upstream: "http://unix:///var/run/puma/my_app.sock:/get", host: "securities-api-prod.elasticbeanstalk.com"
2015/05/20 16:27:17 [crit] 1537#0: *20 connect() to unix:///var/run/puma/my_app.sock failed (2: No such file or directory) while connecting to upstream, client: 172.31.51.94, server: _, request: "POST /get HTTP/1.1", upstream: "http://unix:///var/run/puma/my_app.sock:/get", host: "securities-api-prod.elasticbeanstalk.com"
2015/05/20 16:27:19 [crit] 1537#0: *20 connect() to unix:///var/run/puma/my_app.sock failed (2: No such file or directory) while connecting to upstream, client: 172.31.51.94, server: _, request: "POST /get HTTP/1.1", upstream: "http://unix:///var/run/puma/my_app.sock:/get", host: "securities-api-prod.elasticbeanstalk.com"
2015/05/20 16:27:22 [crit] 1537#0: *16 connect() to unix:///var/run/puma/my_app.sock failed (2: No such file or directory) while connecting to upstream, client: 172.31.44.210, server: _, request: "GET /datapoint?tickers=AAPL&datapoints=Ratings HTTP/1.1", upstream: "http://unix:///var/run/puma/my_app.sock:/datapoint?tickers=AAPL&datapoints=Ratings", host: "securities-api-prod.elasticbeanstalk.com"
2015/05/20 16:27:27 [crit] 1537#0: *20 connect() to unix:///var/run/puma/my_app.sock failed (2: No such file or directory) while connecting to upstream, client: 172.31.51.94, server: _, request: "POST /get HTTP/1.1", upstream: "http://unix:///var/run/puma/my_app.sock:/get", host: "securities-api-prod.elasticbeanstalk.com"
2015/05/20 16:27:32 [crit] 1537#0: *20 connect() to unix:///var/run/puma/my_app.sock failed (2: No such file or directory) while connecting to upstream, client: 172.31.51.94, server: _, request: "POST /get HTTP/1.1", upstream: "http://unix:///var/run/puma/my_app.sock:/get", host: "securities-api-prod.elasticbeanstalk.com"
2015/05/20 16:28:53 [crit] 1537#0: *52 connect() to unix:///var/run/puma/my_app.sock failed (2: No such file or directory) while connecting to upstream, client: 172.31.51.94, server: _, request: "GET /datapoint?tickers=AAPL&datapoints=Ratings HTTP/1.1", upstream: "http://unix:///var/run/puma/my_app.sock:/datapoint?tickers=AAPL&datapoints=Ratings", host: "securities-api-prod.elasticbeanstalk.com"
2015/05/20 16:30:47 [crit] 1537#0: *69 connect() to unix:///var/run/puma/my_app.sock failed (2: No such file or directory) while connecting to upstream, client: 172.31.51.94, server: _, request: "POST /get HTTP/1.1", upstream: "http://unix:///var/run/puma/my_app.sock:/get", host: "securities-api-prod.elasticbeanstalk.com"

我认为 puma 正在运行 -

[ec2-user@ip-172-31-44-135 nginx]$ ps aux | grep puma
root     23299  1.0  0.2  53008  1428 ?        Ss   16:38   0:00 su -s /bin/bash -c puma -C /opt/elasticbeanstalk/support/conf/pumaconf.rb webapp
webapp   23314  0.0  2.4  75764 14604 ?        Rsl  16:38   0:00 /opt/rubies/ruby-2.1.4/bin/ruby /opt/rubies/ruby-2.1.4/bin/puma -C /opt/elasticbeanstalk/support/conf/pumaconf.rb
ec2-user 23317  0.0  0.1 110284   844 pts/0    S+   16:38   0:00 grep puma

pumaconf.rb

directory '/var/app/current'
threads 8, 32
workers %x(grep -c processor /proc/cpuinfo)
bind 'unix:///var/run/puma/my_app.sock'
stdout_redirect '/var/log/puma/puma.log', '/var/log/puma/puma.log', true
daemonize false

有人知道怎么回事吗?

【问题讨论】:

    标签: ruby-on-rails nginx amazon-ec2 amazon-elastic-beanstalk puma


    【解决方案1】:

    日志文件中的这一行表示您的 nginx 配置不正确。

    upstream: "http://unix:///var/run/puma/my_app.sock:/get"
    

    实际上 nginx 尝试使用 unix 域套接字作为 HTTP url。

    如果没有它,你的 nginx 配置不能准确地说出什么问题,但你应该有这样的东西:

    upstream backend {
      server backend1.example.com weight=5;
      server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
      server unix:/tmp/backend3;
    
      server backup1.example.com  backup; 
    }
    

    您还应该查看这个 nginx 文档http://nginx.org/en/docs/http/ngx_http_upstream_module.html

    【讨论】:

    • 知道 nginx 配置的位置吗?
    • 我没有使用 EBS 的经验,但通常 nginx 配置位于 /etc/nginx/sites-enabled/* 但我会尝试将 bind 'unix:///var/run/puma/my_app.sock' 更改为 bind 'tcp://0.0.0.0:8080' 例如.会容易很多
    • @StanislavMekhonoshin 离开 unix 套接字会影响性能。
    【解决方案2】:

    AWS 文档要求将 puma gem 作为应用程序的一部分进行安装。

    根据需要将以下内容添加到您的 Gemfile 中:

    group :production do
      gem 'puma'
    end
    

    【讨论】:

    • 我仍然收到error。似乎请求首先在时间戳中的 puma 之前转到 nginx。不知道如何解决这个问题
    【解决方案3】:

    我遇到了同样的错误,将这两行添加到config/puma.rb 解决了这个问题:

    bind "unix:///var/run/puma/my_app.sock"
    pidfile "/var/run/puma/my_app.sock"
    

    在这一步之后,我在添加 ENV 值时遇到了另一个错误,这非常简单。

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      config.force_ssl = true 更改为false 为我解决了这个问题。

      【讨论】:

      • 你在哪里改的?
      • 这将在 Rails 的配置文件中。 config/environments/production.rb 或您可能正在设置环境特定设置的其他任何地方。也可以在application.rb中
      【解决方案5】:

      抱歉 - 游戏迟到了。但是我在搜索相同的错误消息时发现了这个条目,并且可以以不同的方式解决它。

      我试图让 Rails 6.1.1(当前最新和最好的)应用程序在 AWS Beanstalk(Puma 和 Ruby 2.6)上运行,我得到了与这篇文章中描述的相同的错误:Nginx throwing above connection error / Puma似乎没有反应(puma 日志中没有条目)/当 SSH 进入机器时,它显示 Puma 正在运行(initctl status puma -> 显示进程 ID)。

      经过几天的研究(并尝试了上述所有答案但均未成功)-我改用了Passenger-但结果仍然相同。为Passenger研究同样的问题显示了正确的解决方案:

      如果您想使用 AWS 平台分支已经提供的应用程序服务器(“Puma with Ruby 2.6...”或“Passenger with Ruby 2.6...”),请不要在生产中使用应用程序服务器的 gem (它以某种方式与已安装的版本发生冲突)。因此在您的 Gemfile 中:

      gem 'puma', '~> 5.0', groups: [:development, :test]
      

      分别:

      gem "passenger", ">= 5.3.2", require: "phusion_passenger/rack_handler", groups: [:development, :test]
      

      或者在没有安装应用服务器的情况下使用 AWS Beanstalk 平台(“Ruby 2.6 running on...)

      PS:似乎只是更高版本 Rails 的解决方案(我的旧 Rails 5.1 应用程序在“Puma with Ruby 2.6”平台上完美运行,即使“正常”安装了 gem。

      【讨论】:

      • 这解决了我的问题。在过去的 5 个小时里,我试图将我的 Rails 6.1.3.2 应用程序部署到 Beanstalk 平台 Ruby 2.6.7 和 Puma,这是唯一有帮助的。非常感谢迈克尔!
      • 我也使用平台“Ruby 2.7.3 和 Puma”工作。谢谢!
      【解决方案6】:

      如果 Elastic Beanstalk 因任何原因无法检测到您的 Rails 应用程序根目录,也会出现错误 unix:///var/run/puma/my_app.sock failed (2: No such file or directory)。就我而言,问题只是我将 Rails 应用程序内容压缩到子文件夹中。应用程序内容不是在与appbinconfigdb 等相同的目录中创建,而是在名为<app_name> 的子文件夹中创建。

      唯一的提示是在 Elastic Beanstalk Events 部分,它有一个信息通知(不是警告或错误级别),上面写着 Gemfile not detected. Custom gems will not be included.

      希望这对其他人有所帮助;进行了多次部署来解决这个简单的问题。

      【讨论】:

        【解决方案7】:

        假设您使用的是 Elastic Beanstalk,它会通过运行与此非常相似的命令来启动 puma(如运行 ps 所见):

        sudo su -s /bin/bash -c "puma -C /opt/elasticbeanstalk/support/conf/pumaconf.rb webapp"
        

        尝试在您的 eb ssh 控制台中运行该命令。如果您收到类似this post 中的错误:

        config/puma.rb:23:in `_load_from': undefined local variable or method `daemonize' for #<Puma::DSL:0x000055596fadb448> (NameError)
        

        您可能已经在 Gemfile 中声明了 Puma 5.x。解决方案是使用 puma daemonize 方法。请注意,Elastic Beanstalk 使用的配置不是config/puma.rb,而是/opt/elasticbeanstalk/support/conf/pumaconf.rb

        【讨论】:

          【解决方案8】:

          就我而言,这是由于 Gem 加载错误而发生的。通过使用eb ssh 连接到服务器并运行pumactl start,我能够重现该错误。

          对我来说,冲突与nio4r gem 相关,尽管对其他人来说是puma gem。将其设置为与 Elastic Beanstalk 平台的 gem 相同的版本修复了该错误。

          更多细节在这里: https://stackoverflow.com/a/67110462/1852005 和这里: https://forums.aws.amazon.com/thread.jspa?messageID=957426

          【讨论】:

          • 我也遇到了同样的问题,将 gemfile 中的 nio4r 设置为 gem 'nio4r', '= 2.5.7' 解决了这个问题。
          猜你喜欢
          • 2018-12-30
          • 2019-09-25
          • 2014-09-23
          • 2016-09-01
          • 2012-12-26
          • 2016-05-01
          • 2021-06-22
          • 2019-06-21
          • 2021-10-02
          相关资源
          最近更新 更多