我刚刚将一个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"
我认为美洲狮正在运行 -
[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
任何人都知道发生了什么?
答案 0 :(得分:12)
我遇到了同样的错误,并将这两行添加到config/puma.rb
修复了问题:
bind "unix:///var/run/puma/my_app.sock"
pidfile "/var/run/puma/my_app.sock"
在此步骤之后,我面临另一个错误,即添加ENV值,这非常简单。
希望这有帮助。
答案 1 :(得分:3)
抱歉 - 游戏太晚了。但是我在搜索相同的错误消息时发现了这个条目,并且可以以不同的方式解决它。
我正在尝试让 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 在...上运行)
PS:似乎只是更高版本 Rails 的解决方案(我的旧 Rails 5.1 应用程序在“Puma with Ruby 2.6”平台上完美运行,即使“正常”安装了 gem。
答案 2 :(得分: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 doc http://nginx.org/en/docs/http/ngx_http_upstream_module.html
答案 3 :(得分:0)
AWS doc要求将puma gem作为应用程序的一部分进行安装。
根据需要将以下内容添加到您的Gemfile中:
group :production do
gem 'puma'
end
答案 4 :(得分:0)
将config.force_ssl = true
更改为false
可以解决此问题。
答案 5 :(得分:0)
如果 Elastic Beanstalk 由于任何原因无法检测到您的 Rails 应用程序根目录,也会出现错误 unix:///var/run/puma/my_app.sock failed (2: No such file or directory)
。就我而言,问题只是我将 Rails 应用程序内容压缩到一个子文件夹中。不是在与 app
、bin
、config
、db
等相同的目录中创建 zip,而是在名为 {{1 }}。
唯一的提示是在 Elastic Beanstalk Events 部分,它有一个信息通知(不是警告或错误级别),内容为 <app_name>
希望这对其他人有帮助;经过多次部署才解决了这个简单的问题。
答案 6 :(得分:0)
假设您使用的是 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 < 5.0,因为它删除了 daemonize
方法。请注意,Elastic Beanstalk 使用的配置不是 config/puma.rb
而是 /opt/elasticbeanstalk/support/conf/pumaconf.rb