**TLDR;**我正在Heroku上运行Rails应用程序。我有舞台和生产环境,设置为管道中的2个应用程序。由于heroku堆栈heroku-18已经达到EOL,我正在将应用程序升级到heroku-22。升级分段运行得非常好,但在生产环境中,我收到以下错误:Unable to load application: LoadError: cannot load such file -- fiber
请注意,我的应用程序设置了两个进程:
- web.1:使用puma运行rails的web服务器
- worker.1:运行sidekiq的worker
每次尝试部署时,这两个进程都会崩溃。web.1:
heroku[web.1]: Starting process with command `bundle exec puma -p 11167`
app[web.1]: [2] Puma starting in cluster mode...
app[web.1]: [2] * Puma version: 6.2.2 (ruby 3.2.2-p53) ("Speaking of Now")
app[web.1]: [2] * Min threads: 5
app[web.1]: [2] * Max threads: 5
app[web.1]: [2] * Environment: production
app[web.1]: [2] * Master PID: 2
app[web.1]: [2] * Workers: 2
app[web.1]: [2] * Restarts: (✔) hot (✖) phased
app[web.1]: [2] * Preloading application
app[web.1]: [2] ! Unable to load application: LoadError: cannot load such file -- fiber
app[web.1]: bundler: failed to load command: puma (/app/vendor/bundle/ruby/3.2.0/bin/puma)
app[web.1]: <internal:/app/vendor/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require': cannot load such file -- fiber (LoadError)
app[web.1]: from <internal:/app/vendor/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
app[web.1]: from /app/vendor/bundle/ruby/3.2.0/gems/zeitwerk-2.6.8/lib/zeitwerk/kernel.rb:38:in `require'
app[web.1]: from /app/vendor/bundle/ruby/3.2.0/gems/actionview-7.0.4.3/lib/action_view/renderer/streaming_template_renderer.rb:3:in `<top (required)>'
...
和工人。1:
heroku[worker.1]: Starting process with command `bundle exec sidekiq`
heroku[worker.1]: State changed from starting to up
app[worker.1]: 2 TID-398 INFO: Booting Sidekiq 4.0.2 with redis options {:url=>"REDACTED", :ssl_params=>{:verify_mode=>0}}
app[worker.1]: bundler: failed to load command: sidekiq (/app/vendor/bundle/ruby/3.2.0/bin/sidekiq)
app[worker.1]: <internal:/app/vendor/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require': cannot load such file -- fiber (LoadError)
app[worker.1]: from <internal:/app/vendor/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
app[worker.1]: from /app/vendor/bundle/ruby/3.2.0/gems/zeitwerk-2.6.8/lib/zeitwerk/kernel.rb:38:in `require'
app[worker.1]: from /app/vendor/bundle/ruby/3.2.0/gems/actionview-7.0.4.3/lib/action_view/renderer/streaming_template_renderer.rb:3:in `<top (required)>'
...
环境详情:
- ruby 3.2.2
- rails 7.0.4.3
- puma 6.2.2
- sidekiq 4.0.2(还没有升级这个,但应该不会影响web.1)
- 试运行和生产环境非常相似。它们使用相同的gem,除了newrelic_rpm(仅用于生产),它不在崩溃堆栈跟踪中。在heroku中,它们在dynos和db类型等方面拥有几乎相同的资源。
这两个进程都崩溃的事实让我认为有什么问题与puma或sidekiq配置无关。事实上,这两个运行良好的分期让我感到困惑。
我首先使用heroku CLI升级staging环境,将堆栈设置为heroku-22,然后部署最新版本的代码库(包括新的ruby版本,新的rails版本,以及其他gem和代码更新)。然后,我尝试了以下方法(在每次部署尝试以崩溃告终后回滚到最后一个工作版本):
- 将staging应用提升到生产环境(heroku管道功能)。
- 从CLI升级生产堆栈,然后手动部署(不使用管道)。
- 联系Heroku客户支持。
- 设置HEROKU_DEBUG_RAILS_RUNNER=1(由Heroku CS建议),这不会产生任何其他消息。
- 在部署失败后立即重新启动dynos。
- 将dynos扩展到0,然后部署,然后再向上扩展。
2条答案
按热度按时间ds97pgxw1#
部分答案写这个问题帮助我意识到newrelax_rpm gem只在生产环境中安装。我最初并不怀疑它会与崩溃有关,但我尝试在我的Gemfile中注解它,现在应用程序可以正确部署到生产环境!
这不是一个完整的答案,因为我不知道为什么newrelic_rpm崩溃(我已经审查了
newrelic.yml
配置文件,它几乎匹配推荐的一个)。但至少它给了我一条继续调试的路径。我计划将当前版本部署到生产环境中(不使用newreligy),并部署到一个使用newreligy的版本,看看我是否可以在那里重现崩溃并继续测试。
今天的教训:让你的环境尽可能的相似。
aydmsdu92#
崩溃是由于使用了
newrelic_rpm
gem的9.2.2版本。将Gemfile更新为gem 'newrelic_rpm', '< 9.0'
将导致安装v8.16.0,并且应用程序正确加载(并且NewRelic集成按预期工作)。目前还不清楚为什么v9.2.2会崩溃。我已经记录了一个问题here,并可能发布一个新版本的这个问题,是特定于崩溃的情况。