Puma在Elastic Beanstalk上的Rails 6 API项目中出现“工作进程提前终止”的错误消息。

24

我有一个Rails 6 api-only 应用程序,但是我无法在AWS Elastic Beanstalk上运行它。在部署该应用程序后,puma进程会卡住并显示“Early termination of worker”消息。我没有任何自定义配置或设置该项目。只是创建了一个环境并上传了存档的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
  • Puma 版本:4.3.1
  • Rails 版本:6.0.2.1

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

6个回答

25

最近在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,提交并推送更改,最后部署即可。


1
当然运行 "pumactl start" 命令帮助我获取了实际的错误信息! - James
1
感谢您展示如何获取实际错误! - Artur Haddad
1
我能够使用 rackup config.ru 看到我的问题。 - CTS_AE
2
我敢打赌,如果你添加了一个 Procfile 文件,就可以解决问题 (web: bundle exec puma -C /opt/elasticbeanstalk/config/private/pumaconf.rb)。在 默认设置 中添加了 bundle exec - x-yuri

10

遇到了同样的错误。事实证明这是猞猁的不同补丁。

我正在使用来自Elastic Beanstalk的这个堆栈。

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'

教训是始终将您的环境与部署工具环境相匹配。在此查看最新的解决方案堆栈版本。


1
请参见其他答案。在我的情况下,添加一个Procfile有所帮助(web: bundle exec puma -C /opt/elasticbeanstalk/config/private/pumaconf.rb)。将bundle exec添加到默认值中。 - x-yuri

7

当Puma无法启动时会发生这种情况。

好消息是,你可以在本地运行

bundle exec puma -p 3000 -e production

然后你会得到详细的错误信息。

我个人发现了一个对于has_many的 :optional 标签和一些delayed_job问题的解决方法,这可能也适用于你遇到的问题。所以并没有一种通用的解决方案。


2
@Vic的回答很有帮助,你需要确保已经锁定了正确的Puma版本,但是这并没有解决我的问题。对我来说,问题在于我的代码中调用了,而且这些凭据在Elastic Beanstalk实例上没有设置。
我将那段代码更改为只使用环境变量,例如,并在Elastic Beanstalk配置->软件设置页面中设置这些环境变量。
不幸的是,我找不到任何日志告诉我我的应用程序在哪里崩溃了。我必须从一个基本的Rails安装开始,然后慢慢地将Gems和代码从我的原始项目中移植过来。每次添加一个文件时,我都会使用确认它是否工作,并最终将问题缩小到一个特定的文件。

0

我忘了说一下我的项目结构。我有一个名为overrides的目录,位于app/文件夹下面。

最后,我发现app/overrides文件夹导致了Puma崩溃,可能与这个问题有关:如何在Rails 6中忽略Zeitwerk中的文件夹?

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


0
我的 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
  • Puma版本:4.3.5
  • Rails版本:6.0.3.2

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