hene

hene.dev

Rails のアップグレードで、画像や CSS が読み込まれなかった

Rails のアップグレードで、画像や CSS が読み込まれなかった

事象

Rails のバージョンを 5.1.4 から 6.0.2.rc1 にアップデートした。 本番リリース後に、静的なアセットが読み込まれず、生の HTML だけが表示された。

* 静的なアセット: JavaScript, CSS, 画像 など

原因

環境変数に RAILS_SERVE_STATIC_FILES を設定していなかった。

RAILS_SERVE_STATIC_FILES を設定していないと、静的なアセットを配信できない。 デフォルトだと Nginx などにおいて配信するが、担当プロジェクトでは Rails から配信していた。

config.publick_file_server.enabled = true

false だと、public 以下のファイルは公開されず、他の配信用サーバーから配信する必要がある。パフォーマンス面から言えば、静的なファイルは Rails からではなく、CDN などで配信する方が良い。

対応

環境変数に、RAILS_SERVE_STATIC_FILES を設定。

なぜ気づかなかったか

Rails のバージョンを上げた際($ bundle exec rails app:update 実行時)に、 config/environments/production.rb のみ書き換えられていたため。

# config/environments/production.rb

config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

担当プロジェクトでは、本番リリース前に staging で動作確認をしており、 config/environments/staging.rb を読み込んでいた。

# config/environments/staging.rb

config.public_file_server.enabled = true

config/environments/staging.rb は書き換えられていなかったので、 問題なく静的アセットが配信されていて、サイトを閲覧できたので、staging で気づくことができなかった。

再発防止策

config/environments/production.rbconfig/environments/stagin.rb の中身を同じにする。 中身が同じであれば、staging で気づけた。

stagingproduction の環境変数や設定ファイルの差分をできるだけ少なくしておく。 どういう差分があるのか、把握しておく。

参考

関連記事