noise

計算機科学や各種設定のメモ

Rails3 + Unicorn + nginx で Web アプリケーション開発メモ

簡単ではありませんでした。
自分用にTipsを書きます。

環境は

Arch Linux 3.2.11
Ruby 1.9.3p125
Rails 3.2.3
Unicorn 4.2.1
nginx 1.0.14

です。

基本的なこと

DBは標準で sqlite3 が用いられる。

rails generate model order

とすると スキーマ定義用 migration ファイルが作成される。

Asset Pipeline
cssjavascript をキャッシングしてリクエスト数を削減するらしい

DB操作

rake db:migrate
rake db:drop

Gemfile
APP_ROOT/Gemfile に利用するプラグインの情報を書く。その後

bundle install
bundle update

などとすると必要なプラグインがインストールされる。バージョン指定やgitリポジトリ指定などもできる。
それから gem でインストールしたプラグインがコマンドを提供する場合、 gem リポジトリの bin ディレクトリに PATH を通す必要がある。

Railsにおけるバックグラウンドジョブについて

まず、 delayed_job を用いたがうまくいかず。
おそらく RailsRuby のバージョン違いによるバグかと思われる。

つぎに、Background Jobs in Ruby on Rails を参考に Spawn を導入。簡単だし、forkによる実装のため入出力が rails_server と共有されてデバッグしやすい。
Controller 内で

spawn do
# バックグランドでさせたい処理
...
end

と書くだけ。

Unicorn + nginx でのデプロイ

まず /var/www/rails/app などに rails アプリケーションを配置。
次のような APP_ROOT/config/unicorn.rb (ファイル名は任意)を作成

ROOT_PATH = "/var/www/rails/YOUR_APPNAME"
listen "/tmp/YOUR_APPNAME.sock", :backlog => 64
worker_processes 2 # this should be >= nr_cpus
pid ROOT_PATH + "/tmp/pids/unicorn.pid"
stderr_path ROOT_PATH + "/log/unicorn.log"
stdout_path ROOT_PATH + "/log/unicorn.log"

nginx 側の設定ファイルはこのようなかんじ

(略)
http {
(略)
    upstream YOUR_APPNAME {
        server unix:/tmp/YOUR_APPNAME.sock;
    }
(略)
    server {
        listen       80;
        server_name  _;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        root /var/www/rails/YOUR_APPNAME/public;

        location / {
            #root   html;
            #index  index.html index.htm;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;

            if (!-f $request_filename) {
              proxy_pass http://YOUR_APPNAME;
              break;
            }
        }
(略)
        error_page   500 502 503 504  /500.html;
        location = /500.html {
            root   /var/www/rails/YOUR_APPNAME/public;
        }
(略)
}
(略)

web上にあるサンプルでは nginx--unicorn 通信に tcp を用いているものが多いがここでは Unix domain socket を利用する。
静的なファイルが見つからなければ proxy (今回はUnicorn)を利用するという設定になっている。

実行はアプリケーションディレクトリに移動し

unicorn_rails -E production -D -c config/unicorn.rb
nginx

Unicorn 終了は

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

killall unicorn_rails

とすればいいのかな

nginx の終了は

nginx -s stop
(´・ω・`)

Unicorn の代わりに Phusion passenger を利用しようとしたがコンパイルが通らず。


さくらのVPS上の FreeBSD 環境でもうまくいくか試す予定。