使用Puma在Elastic Beanstalk上部署的Rails应用程序失败-每个请求返回502错误。

26

我刚将一个Rails应用部署到弹性豆荚,但每个请求都会导致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"

我认为“美洲狮”在奔跑 -

[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

有人知道正在发生什么吗?

10个回答

22

我遇到了相同的错误,将以下两行添加到config/puma.rb中可解决问题:

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

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

希望这可以帮助到您。


现在在启动EB上的puma后,我得到了No such device or address @ rb_sysopen - /var/run/puma/my_app.sock (Errno::ENXIO)这个错误信息。 - teddybear

6

非常抱歉-很晚才来回答这个问题。但我在搜索相同错误信息时找到了这篇文章,并且可以用不同的方法解决它。

我正在尝试让一个Rails 6.1.1(当前最新版本)应用程序在AWS Beanstalk上运行(使用Puma和Ruby 2.6),在那里我得到了与本文描述相同的错误:Nginx报告以上连接错误/ Puma似乎不反应(puma日志没有条目)/当通过SSH进入计算机时,它显示Puma正在运行(initctl status puma->显示进程ID)。

经过几天的研究(并尝试所有上述答案都没有成功),我切换到了Passenger,但结果仍然相同。针对Passenger研究相同的问题展示出了正确的解决方案:

当您想要使用AWS平台分支中提供的应用服务器(“带有Ruby 2.6的Puma…”或“带有Ruby 2.6的Passenger…”)时,请勿在生产中使用应用程序服务器的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运行在...”)

注:似乎只适用于更高版本的Rails(我的旧Rails 5.1应用程序在“ Puma with Ruby 2.6”平台上即使安装了gem“正常”也可以完美运行。


3
这对我解决了问题。在过去的5个小时里,我一直试图将我的Rails 6.1.3.2 应用程序部署到Beanstalk平台的Ruby 2.6.7和Puma上,这是唯一有帮助的事情。非常感谢 Michael! - Tom Hert
1
我也使用“Ruby 2.7.3和Puma”平台,并且工作正常。谢谢! - Bob gilong

4

1
我也遇到了同样的问题,将gemfile中的nio4r设置为gem 'nio4r','= 2.5.7'解决了这个问题。 - Smitty

3

谢谢,这个帮了我大忙!之后我还得更新我的Gemfile,以适应他们的Puma版本,即6.3.1。 - undefined
@SabrinaLeggett,根据文档,如果你使用这个配置:web: bundle exec puma -C /opt/elasticbeanstalk/config/private/pumaconf.rb,你在 Gemfile 中的 Puma 版本可以与 EB 的版本不同。 - undefined
实际上,我建议使用bundle exec版本,这样你就可以确保避免EB的Puma(它会发生变化)和你的Gemfile的nio4r版本之间的任何冲突。请参阅https://stackoverflow.com/a/67110462/1852005和https://stackoverflow.com/a/69092359/1852005 - undefined

1
config.force_ssl = true改为false解决了我的问题。

你在哪里修改了那个? - MSC
这将出现在Rails的配置文件中。可以是config/environments/production.rb或者其他任何设置环境特定设置的地方。它也可以在application.rb中。 - katzmopolitan

0
错误unix:///var/run/puma/my_app.sock failed (2: No such file or directory)也会发生,如果 Elastic Beanstalk 无法检测到您的 Rails 应用程序根目录,无论出于什么原因。在我的情况下,问题很简单,我只是将我的 Rails 应用程序内容压缩在一个子文件夹中。而不是在与appbinconfigdb等相同的目录中创建 zip 文件,应用程序内容被创建在一个名为<app_name>的子文件夹中。
唯一的提示在 Elastic Beanstalk 的“事件”部分,其中有一个信息通知(不是警告或错误级别),其中说Gemfile not detected. Custom gems will not be included. 希望这可以帮助其他人;花了很多次部署才找出这个简单的问题。

0

假设您正在使用Elastic Beanstalk,它通过运行与此非常相似的命令(您可以通过运行 ps 来查看)启动 puma

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 < 5.0,因为它删除了daemonize方法。请注意,Elastic Beanstalk使用的配置文件不是config/puma.rb而是/opt/elasticbeanstalk/support/conf/pumaconf.rb

0

检查是否缺少任何新添加的环境变量。

要添加新的环境变量,请按照以下步骤:

  • Elastic Beanstalk >
  • Environments >
  • <Your Environment> >
  • Configuration >
  • Software >
  • EDIT

环境属性下添加新的环境变量

enter image description here


0

你的日志文件中这一行意味着,你的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

1
你知道nginx配置文件在哪里吗? - chintanparikh
1
我没有使用EBS的经验,但通常nginx配置位于/ etc / nginx / sites-enabled / *但我会尝试将bind'unix:///var/run/puma/my_app.sock'更改为bind'tcp://0.0.0.0:8080'。 这将更容易 - Stanislav Mekhonoshin
@StanislavMekhonoshin 如果你放弃使用Unix套接字,性能会受到影响。 - JP Silvashy

0
AWS文档要求将puma gem作为应用程序的一部分进行安装。
根据需要在您的Gemfile中添加以下内容:
group :production do
  gem 'puma'
end

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Shalafister's
这不是真的。你可以选择提供自己的 puma gem,或者使用EB提供的gem。请参阅https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/ruby-platform-procfile.html。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接