Puma 在 Elastic Beanstalk 的 Rails 6 API 唯一项目上坚持消息“工人提前终止”

Posted

技术标签:

【中文标题】Puma 在 Elastic Beanstalk 的 Rails 6 API 唯一项目上坚持消息“工人提前终止”【英文标题】:Puma stuck with message "Early termination of worker" on Rails 6 API only project at Elastic Beanstalk 【发布时间】:2020-05-08 16:55:21 【问题描述】:

我有一个 Rails 6 api-only 应用程序,我无法在 AWS Elastic Beanstalk 上运行。部署该应用程序后,puma 卡住消息“提前终止工作人员”。我没有该项目的任何自定义配置或设置。只需创建一个环境并上传存档的 zip 文件。

使用命令pkill -9 -f puma 杀死 puma 进程后,我的 puma.log 文件如下所示:

=== puma startup: 2020-01-22 13:17:45 +0000 ===
=== puma startup: 2020-01-22 13:17:45 +0000 ===
[28858] Early termination of worker
[28856] Early termination of worker
[28862] Early termination of worker
[28865] Early termination of worker
[28869] Early termination of worker

我搜索了那个错误,没有找到任何解决方法。

Ruby 版本:2.6.5 彪马版本 4.3.1 Rails 版本:6.0.2.1

我正在使用 Puma 和 Ruby 2.6,在 AWS 上的 64 位 Amazon Linux/2.11.2 上运行。

【问题讨论】:

【参考方案1】:

对于最近在 64 位 Amazon Linux 2 平台上运行的 Ruby 2.6 从版本 3.1.1 到 3.1.2 的更新,在我的 EC2 实例中检查 /var/log/puma/puma.log 中的 puma 日志后,它显示了您提到的内容:

[XXXXX] Early termination of worker
[XXXXX] + Gemfile in context: /var/app/current/Gemfile

所以,为了检查实际错误是什么,我输入了我的应用程序的代码文件夹 /var/app/current 并运行

pumactl start

这显示了实际的错误:

[XXXXX] Unable to load application: Gem::LoadError: You have already activated nio4r 2.5.3, but your Gemfile requires nio4r 2.5.2. Prepending `bundle exec` to your command may solve this.

所以,既然它说 nio4r 版本存在冲突,我通过将 nio4r 版本强制为 2.5.3 将其添加到我的 Gemfile 来修复它:

gem 'nio4r', '2.5.3'

然后运行bundle update,提交并推送更改和部署。

【讨论】:

绝对运行 pumactl start 帮助我得到了实际的错误信息! 感谢您展示如何获取实际错误! 我可以使用rackup config.ru看到我的问题 我敢打赌,添加 Procfile 会对您有所帮助 (web: bundle exec puma -C /opt/elasticbeanstalk/config/private/pumaconf.rb)。将bundle exec 添加到default one。【参考方案2】:

当 Puma 无法启动时发生。

好消息,你可以跑了

bundle exec puma -p 3000 -e production

在本地,然后你会得到详细的错误。

我个人在 has_many 和一些 delay_job 问题上发现了一个 :optional 标记,这让我的问题崩溃了。所以没有人能解决这个问题。

【讨论】:

【参考方案3】:

我的 puma 配置有一个“on_worker_boot”块正在尝试连接数据库。就我而言,我在 Rails 中有一个主 + 副本设置。从我们的 puma 配置中删除此连接语句可解决 Early termination of worker 错误。

ActiveRecord::Base.establish_connection(YAML.load_file("#app_dir/config/database.yml")[ENV.fetch('RAILS_ENV')])

Ruby 版本:2.6.2 彪马版本 4.3.5 Rails 版本:6.0.3.2

【讨论】:

【参考方案4】:

@Vic 的回答很有帮助,您应该确保已锁定正确的 Puma 版本,但它并没有解决我的问题。对我来说,问题是我的一段代码称为Rails.application.credentials[...],并且没有在 Elastic Beanstalk 实例上设置凭据。

我将该代码更改为仅使用 ENV 变量,例如 ENV["MY_VAR"],并在 Elastic Beanstalk 配置->软件设置页面中设置这些环境变量。

不幸的是,我找不到的日志中没有任何内容告诉我这是我的应用程序崩溃的地方。我不得不从一个简单的 Rails 安装开始,然后慢慢地从我的原始项目中引入 Gems 和代码。每次我添加一个文件时,我都会使用eb deploy 来确认它有效,最后将问题缩小到一个无效的特定文件。

【讨论】:

【参考方案5】:

遇到了同样的错误。原来它是 puma 的不同 PATCH。

我正在使用弹性豆茎中的这个堆栈

Ruby 2.6 AL2 version 3.0.1
64bit Amazon Linux 2 v3.0.1 running Ruby 2.6
Ruby 2.6.6-p146
RubyGems 3.1.2
Puma 4.3.3
...

我的项目的Gemfile 以这种方式包含puma

gem 'puma', '~> 4.3.3'

我的项目是我即将到来的新项目的样板,因此“旧”项目的工作正常,直到更新的补丁版本,截至目前的 puma 4.3.5 发布。

解决方案是修复 Gemfile 中 gem 的版本,如下所示:

gem 'puma', '= 4.3.3'

经验教训是始终将您的环境与部署工具的环境相匹配。跟踪最新的解决方案堆栈版本here。

【讨论】:

见other answer。在我的情况下,添加 Procfile 有助于 (web: bundle exec puma -C /opt/elasticbeanstalk/config/private/pumaconf.rb)。将bundle exec 添加到default one。【参考方案6】:

我忘了告诉我我的项目结构。我在 app/ 文件夹下有一个名为 overrides 的目录。

最后,我发现在那个 app/overrides 文件夹导致 puma 崩溃可能与这个问题有关:How to ignore a folder in Zeitwerk for Rails 6?

在我更改 environment.rb 文件并忽略 app/overrides 文件夹后,我的项目开始顺利运行。

【讨论】:

以上是关于Puma 在 Elastic Beanstalk 的 Rails 6 API 唯一项目上坚持消息“工人提前终止”的主要内容,如果未能解决你的问题,请参考以下文章

Rails Elastic Beanstalk 连接超时 - puma 服务器

将 Rails + Puma + Postgres 应用程序部署到 Elastic beanstalk 的正确方法?

运行 Puma 和 Nginx 的带有 AWS Elastic Beanstalk 的 Rails 应用程序 502

Puma 在 Elastic Beanstalk 的 Rails 6 API 唯一项目上坚持消息“工人提前终止”

502 bad gateway nginx + puma + rails 3.2 on Elastic Beanstalk

如何在 Elastic Beanstalk 上的 Rails 4 Puma 应用程序中设置 RDS_DB_NAME