概要
- ステージングやプロダクション環境でPumaを起動しようとするとエラーが出て起動しない
- ステージングやプロダクション環境にデプロイしようとするとエラーが出て途中で終了する
- ローカルの開発環境ではエラーなくRailsが起動する
このような状況になった時、様々な原因が考えられます。
デプロイ設定やインフラが疑われますが、真っ先につぶしておきたい可能性があります。
本当にローカルの開発環境ではエラーないの?
この記事ではその確認方法を紹介します。
目次
バージョン
エラー状況
エラー原因
確認方法
よくあるエラー
最後に
バージョン
Ruby:2.7.3
Rails:6.1.4.4
Puma:5.0
Capistrano:3.16.0
エラー状況
Puma起動時にエラーになる
/var/www/rails/application/shared/vendor/bundle/ruby/2.7.0/gems/zeitwerk-2.5.4/lib/zeitwerk/loader/callbacks.rb:25:in `on_file_autoloaded'
Zeitwerk::NameError
あるいは、
Deploy途中のyarn installでエラーになる
error Command "webpack" not found.
(webpackerを動かすためにrailsを起動しようとして失敗)
あるいは、
Deploy途中のwheneverでエラーになる
from config/schedule.rb:6:in `initialize'
from config/schedule.rb:6:in `require'
(wheneverの設定が悪いと思いきやrails起動に失敗していることがある)
エラー原因
Railsのステージングやプロダクション環境では、Railsの起動時に大半のコードが読み込まれます。コードにシンタックスエラーなどがあると、コードの読み込みに失敗してRailsを起動することができません。
一方、開発環境(development)では、Rails起動時にコードが読み込まれる訳ではありません。大抵のコードは必要になった時に読み込まれます。Railsが起動するだけでは読み込まれないコードが多くあるのです。
そのため開発環境では一見問題なく動作しているように見えてもエラーを抱えたままといったことがあります。そしてステージングやプロダクション環境でRailsを起動した時に隠れていたエラーが表面化するのです。
確認方法
開発環境(development)でもステージングやプロダクション環境と同じようにRails起動時にコードを読み込ませる方法があります。
config/environments/development.rb
変更前
config.cache_classes = false
config.eager_load = false
↓
変更後
config.cache_classes = true
config.eager_load = true
開発環境(development)でRailsを起動してみてください。
シンタックスエラーがあったりするとエラーが出てRailsが起動しなくなるはずです。
よくあるエラー
Railsではファイル名とクラス名が一致していないと起動時にエラーになる
例
ファイル名「hoge.rb」
クラス名「Hoge」でなければならないが
「Fuga」とか違ってたら起動時にエラーになる
最後に
Pumaが起動しない。Deployできない。その原因は多くの可能性が考えられます。
サーバー、ネットワーク、デプロイ、Pumaといったいった環境周りが原因かもしれません。
ローカル開発環境では動いてたのに。。。
よーく調べてみるとRubyコードの凡ミスだったということがあります。
この記事が問題の切り分けのお役に立てればと思います。