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.rb
と config/environments/stagin.rb
の中身を同じにする。
中身が同じであれば、staging
で気づけた。
staging
と production
の環境変数や設定ファイルの差分をできるだけ少なくしておく。
どういう差分があるのか、把握しておく。