塩焼きブログ

塩焼きに関しての研究内容を公開しています

RailsアプリをNginx + Unicornで公開する : CentOS・RedHat編

Rubyがインストールされている環境にnginxとunicornを導入しRailsアプリを公開する手順を紹介する。導入は非常に簡単な作業のみで終了する。前提条件としてのRubyのインストールは最新バージョンのRuby環境構築 : CentOS・RedHat編を参照のこと。

Nginx+UnicornだけでなくApache+Passengerの構成でRailsアプリを公開することも可能であり、RailsアプリをApache + Passengerで公開する : CentOS・RedHat編で紹介しているので、好みによって好きな方で構築したい。

bundlerをインストール

unicornbundle installでまとめてインストールしたいのでbundlerをインストールする

gem install bundler

Gemfileのunicornを有効化

gem 'unicorn'

bundle installの実行

Railsアプリをデプロイした後bundle installを実行する。この作業によってunicornも同時にインストールされる。MySQLなどを使用している時は、それら関連するライブラリ郡も事前にインストールしておく。

unicornの設定

Railsアプリ内にconfig/unicorn.rbを作成しunicornに関する設定を記述

working_directory "/var/lib/app_name"
pid "/var/lib/app_name/tmp/pids/unicorn.pid"
stderr_path "/var/lib/app_name/log/unicorn.log"
stdout_path "/var/lib/app_name/log/unicorn.log"
 
listen "/tmp/unicorn.app_name.sock"
worker_processes 2
timeout 30

unicornを起動する時は起動したいRailsアプリのディレクトリに移動後これを実行するだけ

bundle exec unicorn -E production -c config/unicorn.rb -D

unicornを停止する

kill -QUIT `cat tmp/pids/unicorn.pid`

unicornを再起動する

kill -HUP `cat tmp/pids/unicorn.pid`

Nginxのインストール

nginx: Linux packagesよりリポジトリを取得し追加する

rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

インストールを行う

yum install nginx

設定は下記のファイルで行う

/etc/nginx/nginx.conf
/etc/nginx/default.conf
/etc/nginx/*.conf

起動、停止、再起動の方法

service nginx start
service nginx stop
service nginx restart

/etc/init.d/nginx start
/etc/init.d/nginx stop
/etc/init.d/nginx restart

Railsアプリの公開

/etc/nginx/app_name.confを作成しnginxを設定する

upstream unicorn_app_name {
  server unix:/tmp/unicorn.app_name.sock
  fail_timeout=0;
}

server {
  listen 80;
  server_name example.com;

  root /var/rails/app_name/public;

  try_files $uri @unicorn_app_name;

  location @unicorn_app_name {
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn_app_name;
  }

  error_page 500 502 503 504 /500.html;
}

nginxを起動する

service nginx start

unicornを起動する

cd /var/rails/app_name
bundle exec unicorn -E production -c config/unicorn.rb -D

これで公開できるはずである。Railsアプリをデプロイしても変更内容は反映されないため、変更内容を反映させたい時は再起動を忘れない。

kill -HUP `cat tmp/pids/unicorn.pid`

バーチャルホストで複数のRailsアプリを公開することも可能である

upstream unicorn_app_name {
  server unix:/tmp/unicorn.app_name.sock
  fail_timeout=0;
}
upstream unicorn_app_name2 {
  server unix:/tmp/unicorn.app_name2.sock
  fail_timeout=0;
}

server {
  listen 80;
  server_name example.com;

  root /var/rails/app_name/public;

  try_files $uri @unicorn_app_name;

  location @unicorn_app_name {
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn_app_name;
  }

  error_page 500 502 503 504 /500.html;
}
server {
  listen 80;
  server_name example2.com;

  root /var/rails/app_name2/public;

  try_files $uri @unicorn_app_name2;

  location @unicorn_app_name2 {
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn_app_name2;
  }

  error_page 500 502 503 504 /500.html;
}

通常はファイルを分けるべきだが、分かりやすく繋げている

参考文献

Nginx + UnicornでRailsアプリ(Redmine)を動作させる nginxをyumでインストールする手順 nginxでデフォルトのバーチャルホストを設定する方法