RubyonRailsをNginxとUnicornで動かす方法

Shunsuke Sawada

Railsアプリケーションを動かす環境について。
今度はNginxとUnicornです。

ApacheとPassengerについては下記参照。

RubyonRailsをApacheとPassengerで動かす | Workabroad.jp

Rails & Passenger を Production(本番)モードで公開する時 | Workabroad.jp

Railsアプリが動くまで。
最低限の設定をします。

環境

Vagrant

ApacheとかWebrickとかいろいろと試してみたいので、
ポートをわけようと思います。必要なければ読み飛ばしてください。

Vagrantfile

1
2
3
4
  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  config.vm.network :forwarded_port, guest: 8080, host: 8080

ひとまず、Nginxを使うときはポート8080でアクセスすることにします。
※forwarded_portの書き方はVagrantのバージョンによって少し違うようです。

1
2
3
$ exit
Vagrantの設定を読み込み直します。
$ vagrant reload

Nginx

インストール

1
2
3
4
$ sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
$ sudo yum install nginx
確認
$ nginx -v

設定
Ubuntuの場合はsite-unabledとかいうディレクトリがあるみたいですけど、
CentOSではなかった。
でも、別に必要ない。

設定ファイル1.

/etc/nginx/nginx.conf

→ 特にさわらなくても良いかと。

設定ファイル2.

/etc/nginx/conf.d/default.conf

→ 自分用にカスタマイズ

1
2
3
4
5
$ cd /etc/nginx/conf.d/
設定ファイルをコピー
$ sudo cp default.conf your_app.conf
編集
$ sudo vi your_app.conf

/etc/nginx/conf.d/your_app.conf

1
2
3
4
5
6
7
8
server {
    listen       8080;
    server_name  your_app.com;
    # Vagratのデフォルトはこうなってた気がするが。
    root   /var/www/html/your_app/public;
    # 404ファイルでちょっとテストしてみる。
    index  404.html;
}

起動

1
$ sudo service nginx srart

your_app.com:8080にブラウザからアクセスすれば
Railsの404ページが表示されるはず。
この時点で「403 forbidden」とかNginxのエラーが表示されたら
ディレクトリのパーミッションとかを疑いましょう。

なお、アパッチも起動してますと言う場合は終了させるか、
/etc/nginx/conf.d/default.confのlistenを80以外にしておくと、
Nginx起動しない!なんてことがないかと。

Unicorn

RailsのGemfile編集

/Gemfile

1
2
# Use unicorn as the app server
gem 'unicorn'

インストール

1
$ bundle install

設定ファイル

/config/unicorn.rbを作成

/config/unicorn.rb

1
2
3
4
5
6
7
8
9
working_directory "/var/www/html/your_app"
pid "/var/www/html/your_app/tmp/pids/unicorn.pid"
stderr_path "/var/www/html/your_app/log/unicorn.log"
stdout_path "/var/www/html/your_app/log/unicorn.log"

listen "/tmp/unicorn.todo.sock"
#listen 3000
worker_processes 2
timeout 30

Unicorn起動

1
2
# your_appの中
$ bundle exec unicorn -c config/unicorn.rb -D

Nginxの設定ファイルを変更

/etc/nginx/conf.d/your_app.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
upstream unicorn {
  server unix:/tmp/unicorn.todo.sock fail_timeout=0;
}

server {
    listen       8080;
    server_name  your_app.com;

    root   /var/www/html/your_app/public;
    # indexはコメントアウト
    # index  404.html;

    try_files $uri @unicorn;

    location @unicorn {
      proxy_set_header Host $http_host;
      proxy_pass http://unicorn;
    }
    # エラーは500.htmlを表示させる
    error_page 500 502 503 504 /500.html;
}

Nginx再起動

1
$ sudo service nginx restart

以上です。
Vagrantローカル環境ですが、Apache+Passengerよりもだいぶ速くなりました。

プロセス終了は
$ kill -QUIT 12273
log -> [2013-10-25T13:54:03.608581 #12273]
とかでいいのかな。

30
Shunsuke Sawada

おすすめの記事

CakePHP 2.x JSヘルパーでajax通信(ajax helperは使わない)
20
Rails4でQiita投稿ボタンをつくった
18
紙のデザイナーがウェブ開発できるようになるまでに必要なこと
451