Rails 5.0.2 + Unicorn + Nginx で本番環境の構築 (編集中)


本番環境構築にハマりまくったので備忘録として残す

一番悩んだポイントは、nginxとunicornの設定ファイルの記述。

お悩みポイント

  1. apacheなのか、nginxなのかで悩む
  2. unicornなのかpassengerなのかpumaなのか、webrickなのかで悩む(そもそもなんで種類があるのかで悩む)
  3. nginx、unicornの設定ファイルの記述で悩む

1と2は記事の紹介にとどめて、3に関して詳しく書こうと思います。

この記事が大変役に立ちました!m(_ _)m
Rails開発におけるwebサーバーとアプリケーションサーバーの違い(翻訳)

これをそのまま参考にしました
世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで

最初に結論

Nginx + Unicorn + Rails の構成を取るのが一般的(らしい?)との記述があったので、その通りの構成にした。

参考:Unicorn と Nginx と Rails の関係

Unicorn + Rails でも動かせるので、一旦これで動作を確認した後、Nginxをかまして設定するのがいいかも
(Nginxもuniornも設定ファイルを手探りで書いたのでどっちに原因があるか分からなかったため)

Nginx単体では、Rackの機能をサポートしていない為、Nginx + Rails ではアプリケーションは動作しない。

unicornとnginxをサーバーにインストールする

世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで

configファイルを書く

アプリが/var/www/rails/sampleAppにあるとして進めて行きます

必要に応じて適宜読み替えてくださいm(_ _)m

!!下記の3つのファイルが重要です!!

  1. /var/www/rails/sampleApp/config/unicorn.rb
  2. /etc/nginx/nginx.conf
  3. /etc/nginx/sites-enabled/sampleApp.conf

[重要]
・unicornを起動する時にどのconfigファイルを読み込むか指定するので、unicorn.rbという名前じゃなくても良い
・/etc/nginx/nginx.confの中で、sites-enabledの配下にある.confファイルを読み込むように指定するのでsampleApp.confという名前じゃなくても良いし、sites-enabledというディレクトリ名じゃなくても良い

/var/www/rails/sampleApp/config/unicorn.rb

@app_path = '/var/www/rails/sampleApp'
working_directory @app_path

worker_processes 2
preload_app true
timeout 30

# Unicorn socket
#listen 80 # unicorn単体で動かす時
listen '/var/www/rails/sampleApp/tmp/unicorn.sock'
# Unicorn PID file location
pid '/var/www/rails/sampleApp/pids/unicorn.pid'

# Path to logs
stderr_path '/var/www/rails/sampleApp/log/unicorn.error.log'
stdout_path '/var/www/rails/sampleApp/log/unicorn.access.log'

before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end 

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

/etc/nginx/nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;
    include       sites-enabled/*.conf; # ここで追加で読み込むファイルを指定
    sendfile      on;
}

http {} の中に include sites-enabled/*.conf; を追加してください

/etc/nginx/sites-enabled/sampleApp.conf

/etc/nginx/sites-enabledのディレクトリがない場合はmkdirで作成し、sampleApp.confファイルをディレクトリ内部に作成してください

# log directory
error_log  /var/www/rails/sampleApp/log/nginx.error.log; 
access_log /var/www/rails/sampleApp/log/nginx.access.log;
# max body size
client_max_body_size 4G;
upstream unicorn_server {
  # for UNIX domain socket setups
  server unix:/var/www/rails/sampleApp/tmp/unicorn.sock fail_timeout=0;
}
server {
  listen 80;
  server_name {グローバルIPアドレス};

  # nginx so increasing this is generally safe...
  keepalive_timeout 5;

  # path for static files
  root /var/www/rails/sampleApp/public;

  # page cache loading
  location / {
    try_files $uri/index.html $uri.html $uri @unicorn_server;
  }

  location ~ ^/assets/ {
    root /var/www/rails/sampleApp/public;
  }
  location @unicorn_server {
    # HTTP headers
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://unicorn_server;
  }
  # Rails error pages
  error_page 500 502 503 504 /500.html;
  location = /500.html {
    root /var/www/rails/sampleApp/public;
  }
}

その他

サーバーはAWSのEC2で構築、DBサーバーは建てなかった
お名前.comで独自ドメインを取得している。勿論、なくても問題ないけど、本番で動かすならドメインはとる人の方が多いかなと。