https://qiita.com/search?q=RAILS_SERVE_STATIC_FILES を見てみて下さい。環境変数RAILS_SERVE_STATIC_FILES
を設定し忘れて、静的ファイルが取得出来ない事例がたくさん見みつかります。
多くの人がつまづくにも関わらず、なぜconfig.public_file_server.enabled
は環境変数RAILS_SERVE_STATIC_FILES
を参照するのでしょうか?
config/environments/production.rb
# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present?
ソースコードのコメントを見ると、静的ファイルはApacheやNGINXで扱うはずと書かれています。導入されたころのプルリクエストを漁ってみると次の記述を見つけました。
Currently the ActionDispatch::Static middleware hits disk on every GET and HEAD request to check if the given request maps to a file on disk.
When benchmarked with the entire Rails stack we still see an increase but it is roughly ~2.6% speed increase:
Railsの静的ファイル配信機能をOFFすると2%くらいの性能向上があったようです。ただし、9年前の情報です。Rails 4.2の頃の情報です。今でも同じ効果があるとは限りません。少なくとも導入当初は性能上のメリットがあったようです。
どうやら、Railsをデプロイする標準的なサーバー構成としては、Railsサーバーの手前にApacheやNGINXをリバースプロキシとして配置すると考えられているようです。そのため、デフォルトではRailsの静的ファイル配信機能は無効化されているようです。開発環境での動作確認など限られた状況で手軽に有効に出来るように、環境変数を参照しているようです。
ところで4ヶ月前にマージされた興味深いプルリクエストがあります。
Turn on static file server by default by dhh · Pull Request #47137 · rails/rails
どうやらRails 7.1では、静的ファイル配信機能がデフォルトで有効になるようです。
Modern deployments don't need NGINX/Apache when using CDNs or caching LBs in front.
今時は「ApacheやNGINXは使わないで、RailsサーバーとCDNだけで構成する」のだそうです。