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
css や javascript をキャッシングしてリクエスト数を削減するらしい
DB操作
rake db:migrate rake db:drop
Gemfile
APP_ROOT/Gemfile に利用するプラグインの情報を書く。その後
bundle install bundle update
などとすると必要なプラグインがインストールされる。バージョン指定やgitリポジトリ指定などもできる。
それから gem でインストールしたプラグインがコマンドを提供する場合、 gem リポジトリの bin ディレクトリに PATH を通す必要がある。
Railsにおけるバックグラウンドジョブについて
まず、 delayed_job を用いたがうまくいかず。
おそらく Rails か Ruby のバージョン違いによるバグかと思われる。
つぎに、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