Rails を production モードで起動した際に接続できない(500 エラー)場合の対処法

Rails を production モードで起動する

developmentモードと同じようにして、Railsproductionモードで下記のように起動します。内蔵サーバのPumaの起動です。

$ rails server -e production

ここでエラーが出てしまった場合(そもそもサーバが正常に起動しない場合)は以下の記事に詳しくまとまっていますのでご覧ください。下記記事中のWEBrickという名称は以前のデフォルトの内蔵サーバの名称ですので適宜読み替えましょう。

ここで問題とするのは、サーバは正常に起動したにも関わらず、アクセスをすると 500 エラー が出てしまう場合の対処方法です。

まずはログを確認

エラーが出た場合はまずエラーメッセージ(ログ)を確認します。モニタの前でコードをパラパラ眺めながら、ググって書き換えてあーでもないこーでもないと試行錯誤する前に、とにかくログです。log/production.logを見ます。

すると以下のような記録が残されていました。

I, [2017-06-14T11:00:13.349888 #2620]  INFO -- : [2b9aae88-2e89-40d5-9259-6ec701fb019a] Completed 500 Internal Server Error in 14ms
F, [2017-06-14T11:00:13.350882 #2620] FATAL -- : [2b9aae88-2e89-40d5-9259-6ec701fb019a]   
F, [2017-06-14T11:00:13.351004 #2620] FATAL -- : [2b9aae88-2e89-40d5-9259-6ec701fb019a] ActionView::Template::Error (The asset "foobar_logo" is not present in the asset pipeline.):
F, [2017-06-14T11:00:13.351231 #2620] FATAL -- : [2b9aae88-2e89-40d5-9259-6ec701fb019a]     33: 
[2b9aae88-2e89-40d5-9259-6ec701fb019a]     34: <div class="container">
[2b9aae88-2e89-40d5-9259-6ec701fb019a]     35:   <div class="text-center">
[2b9aae88-2e89-40d5-9259-6ec701fb019a]     36:     <%= link_to image_tag('foobar_logo'), '#' %>
[2b9aae88-2e89-40d5-9259-6ec701fb019a]     37:   </div>
[2b9aae88-2e89-40d5-9259-6ec701fb019a]     38: 
[2b9aae88-2e89-40d5-9259-6ec701fb019a]     39:   <div class="row">
F, [2017-06-14T11:00:13.351279 #2620] FATAL -- : [2b9aae88-2e89-40d5-9259-6ec701fb019a]   
F, [2017-06-14T11:00:13.351330 #2620] FATAL -- : [2b9aae88-2e89-40d5-9259-6ec701fb019a] app/views/foobar/index.html.erb:36:in `_app_views_foobar_index_html_erb__2581585410400794985_47417416281840'

image_tag('foobar_logo')で指定している画像ファイルについて、The asset "foobar_logo" is not present in the asset pipeline.と怒られているのが分かります。この問題を解決するには以下の手順を踏みましょう。

assets を precompile する*1

以下のようにします(Rails 5)。

$ rails assets:precompile

config のproduction.rbファイル中のconfig.assets.compileの値をtrueにする

config/environments/production.rbファイルの中に、config.assets.compileという設定項目があります。デフォルトでfalseとなっているところ、trueに変更します。

サーバを再起動する

サーバを再起動しましょう。これで 500 エラー が解消されたはずです!

$ rails server -e production

参考ページ

以下のページが参考になりました。ありがとうございます。

各種バージョン

Rails version: 5.1.1
Ruby version: 2.4.1 (x86_64-linux)

*1:これは必須ではない

Powered by はてなブログ