Puma 在 Elastic Beanstalk 的仅 Rails 6 API 项目上遇到“提前终止工作线程”消息

问题描述 投票:0回答:7

我有一个仅限 Rails 6 api 的应用程序,无法在 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 上运行。

ruby-on-rails amazon-web-services puma
7个回答
25
投票

对于在 64 位 Amazon Linux 2 平台上运行的 Ruby 2.6 最近从版本 3.1.1 更新到 3.1.2,在检查我的 EC2 实例中的 puma 日志

/var/log/puma/puma.log
后,它显示了您提到的内容:

[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
,提交并推送更改并部署。


10
投票

遇到同样的错误。原来这是 puma 的不同补丁。

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

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'

吸取的教训是始终将您的环境与部署工具的环境相匹配。 在这里跟踪最新的解决方案堆栈版本。


7
投票

当 Puma 无法启动时发生。

好消息,你可以跑步了

bundle exec puma -p 3000 -e production

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

我个人在 has_many 上发现了一个 :optical 标签,并且发现了一些delayed_job 问题,这些问题困扰着我。所以没有一种方法可以解决这个问题。


2
投票

@Vic 的回答很有帮助,你应该确保你已经锁定了正确的 Puma 版本,但这并没有解决我的问题。对我来说,问题在于我的一段名为

Rails.application.credentials[...]
的代码,并且未在 Elastic Beanstalk 实例上设置凭证。

我将该代码更改为仅使用 ENV 变量,例如

ENV["MY_VAR"]
,并在 Elastic Beanstalk 配置 -> 软件设置页面中设置这些环境变量。

不幸的是,我在日志中找不到任何内容告诉我这是我的应用程序崩溃的地方。我必须从最基本的 Rails 安装开始,然后慢慢地从我的原始项目中引入 Gems 和代码。每次添加文件时,我都会使用

eb deploy
来确认它是否有效,并最终将问题范围缩小到某个无法正常工作的特定文件。


0
投票

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

最后,我发现 app/overrides 文件夹导致 puma 崩溃可能与此问题有关:How toignore afolder in Zeitwerk for Rails 6?

在我更改了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
  • 彪马版本4.3.5
  • Rails 版本:6.0.3.2

0
投票

就我而言,Postgres 服务器未启动并且 ENV 丢失。

它不会抛出正确的错误,但最终会导致工人提前终止。

只需确保:

  • 您的数据库已启动并正在运行
  • 所有 ENV 均已更新
© www.soinside.com 2019 - 2024. All rights reserved.