ruby-on-rails Puma在Elastic Beanstalk的Rails 6 API项目上被消息“Early termination of worker”卡住

ubbxdtey  于 2023-10-21  发布在  Ruby
关注(0)|答案(6)|浏览(144)

我有一个Rails 6 api应用程序,我无法在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

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

qni6mghb

qni6mghb1#

对于最近在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,提交和推送更改以及部署。

11dmarpk

11dmarpk2#

犯了同样的错误。原来这是一个不同的补丁美洲狮。
我用的是弹性豆茎的一叠

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'

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

j8yoct9x

j8yoct9x3#

当彪马不能启动时就会发生。
好消息,你可以跑了
bundle exec puma -p 3000 -e production
然后你会得到详细的错误。
我个人在一个has_many和some delayed_job问题上发现了一个:optional标签,这是我的问题。因此,没有一个解决办法。

jdgnovmf

jdgnovmf4#

@维克的回答是有帮助的,你应该确保你已经锁定了正确的彪马版本,但它没有解决我的问题。对我来说,问题是我的一段名为Rails.application.credentials[...]的代码,并且没有在Elastic Beanstalk示例上设置凭据。
我将代码更改为仅使用ENV变量,例如ENV["MY_VAR"],并在Elastic Beanstalk Configuration->Software settings页面中设置这些环境变量。
不幸的是,在我能找到的日志中没有任何东西告诉我这就是我的应用程序崩溃的地方。我不得不从一个基本的Rails安装开始,然后慢慢地从我原来的项目中引入Gems和代码。每次我添加一个文件时,我都会使用eb deploy来确认它是否工作,最后将问题缩小到一个不工作的特定文件。

68de4m5k

68de4m5k5#

我忘了说我的项目结构。我在app/ folder下有一个名为overrides的目录。
最后,我发现app/overrides文件夹导致puma崩溃可能与此问题有关:How to ignore a folder in Zeitwerk for Rails 6?
在我改变了我的environment.rb文件,忽略app/overrides文件夹后,我的项目开始顺利运行。

n9vozmp4

n9vozmp46#

我的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

相关问题