Rails5でnginx+pumaでproduction環境を構築する

nginxのインストール

過去に書いたのこちらを参考

http://blog.atwata.com/middle/2017/04/21/centos-nginx.html

rails側puma設定

rails5ならデフォルトで入っている

rails serverで起動しているのもpuma(webrickではない)

とりあえずpumaをproduction設定で起動

bundle exec puma -t 5:5 -e production -C config/puma.rb

secret_key_base未設定エラー

すると、こういうエラーがでる

RuntimeError: Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml

secret_key_baseがセットされていないというエラー

対応は下記のようにsecretを生成して、環境変数にセットする

bundle exec rake secret

を実行すると長いランダム文字列が生成させる

これはconfig/secret.ymlで管理しているのだが、productionは下記のようになっている

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

cookieの生成に使うらしいので、セキュリティ上ファイル化は好ましくないらしい。

都度生成し、環境変数として渡す仕組みになっている

export SECRET_KEY_BASE=hogehoge

のようにする

改めて起動

bundle exec puma -t 5:5 -e production -C config/puma.rb

assets:precompile未実施エラー

起動ログにエラーは出ていないが画面にアクセスするとエラー。 productionはデフォルトでは起動したコンソールにエラーは出さず、ログファイルに出力される。

log/production.log を確認すると下記の表示。

ActionView::Template::Error (The asset "application.css" is not present in the asset pipeline.):

確認するとproduction環境では自動でcssやjsをコンパイルしてくれないので(デフォルト設定がそうなっているので) 自分でプリコンパイルする必要がある。

bundle exec rake assets:precompile RAILS_ENV=production

しかし

yarnがインストールされていないエラー

下記のエラーが発生

Yarn executable was not detected in the system.
Download Yarn at https://yarnpkg.com/en/docs/install
Download Yarn at https://yarnpkg.com/en/docs/install

yarnがないというエラー。rails5では使うらしい。

yarnとはjavascriptのパッケージマネージャ。npmの後継として利用され始めている。

下記のようにインストール。

npm install yarn -g

起動して画面が表示されるようになった、

静的ファイル(public)にアクセスできない

しかしcssが効かない。画像も表示されない。

確認すると

config/environments/production.rb が下記のような設定になっているために読み込みができなくなっていた

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

上記のように強制的にtrueにする。

ついにproduction環境のpumaでrailsアプリが起動するようになった。

次はnginxとのつなぎ込み

例として下記のように設定ファイルを記述する。

/etc/nginx/conf.d/myapp.conf

upstream puma_myapp {
    server  unix:/path/to/myapp/tmp/puma_myapp.sock;
}

server {
    listen       80;
    server_name  [ホスト名];

    access_log  /var/log/nginx/access.log;
    error_log   /var/log/nginx/error.log;

    root /path/to/myapp/;

    client_max_body_size 100m;
    error_page  404              /404.html;
    error_page  500 502 503 504  /500.html;

    location / {
        proxy_pass http://127.0.0.1:3000/;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }
}

nginx再起動

sudo systemctl restart nginx

これで無事に80番ポートでnginx経由でrailsアプリにアクセスできるようになりました。