追記: 20120405
起動スクリプトのオプションが間違っていたので修正。
--cd $app_root && $rbenv_bin/bundle exec $rbenv_bin/unicorn_rails -c $app_root/config/unicorn.conf.rb -e production $app_root/config.ru
++cd $app_root && $rbenv_bin/bundle exec $rbenv_bin/unicorn_rails -c $app_root/config/unicorn.conf.rb -E production $app_root/config.ru
以下本文
複数バージョンのrubyを共存させるツールとして、過去にはRVMを使っていたが少し前にrbenvに変えた。Rails3世代になり、RVMのgemsetはbundlerで代替可能になったので、RVMの豊富な機能が少し邪魔に感じたので。同時に、サーバーサイドでも管理が簡単なのでrbenvを使うようにした。あまり推奨はされてないようだけど。
rbenvの通常インストール方法はsstephenson/rbenv - GitHubにあるのでそちらを参照するとよい。
また、rbenvで使うrubyインストーラーであるsstephenson/ruby-build - GitHubも一緒に使うとすごく便利。
以下、サーバーで行った作業のログをメモ。
# rbenvインストール
$ git clone git://github.com/sstephenson/rbenv.git /usr/share/rbenv
# profile.dにrbenvの設定を追加
$ vi /etc/profile.d/rbenv.sh
# ここから
export PATH="/usr/share/rbenv/bin:$PATH"
export RBENV_VERSION=ree-1.8.7-2011.12
export RBENV_DIR=/usr/share/rbenv
export RBENV_ROOT=/usr/share/rbenv
eval "$(rbenv init -)"
# ここまで
# /etc/profile.d/rbenv.shに実行権限を与える
$ chmod 755 /etc/profile.d/rbenv.sh
# 一旦上記設定を読み込む
$ source /etc/profile.d/rbenv.sh
# ruby-buildインストール
$ git clone git://github.com/sstephenson/ruby-build.git
$ cd ruby-build
$ ./install.sh
# 今回はREE1.8.7をインストール
$ rbenv install ree-1.8.7-2011.12
# REE1.8.7をデフォルトで使用する
$ rbenv global ree-1.8.7-2011.12
と、ここまででrbenvのセットアップは完了。動作確認のために、一度シェルを再起動した上でrubyのバージョンを確認してみる。
$ ruby -v
ruby 1.8.7 (2011-12-28 MBARI 8/0x8770 on patchlevel 357) [i686-linux], MBARI 0x8770, Ruby Enterprise Edition 2011.12
正しくREEが使われることが確認できた。あとは、gemでrailsとunicorn_railsをインストールすればよい。
rbenv上のREEでunicornを起動するには、以下のようなスクリプトを作ればよい。
app_root=/var/www/rails_application
rbenv_bin=/usr/share/rbenv/versions/ree-1.8.7-2011.12/bin
cd $app_root && $rbenv_bin/bundle exec $rbenv_bin/unicorn_rails -c $app_root/config/unicorn.conf.rb -e production $app_root/config.ru
普段はUpstartでrespawnや自動起動などをしているが、その場合 /etc/init/以下に次のような設定ファイルを作ればいい。これは、アプリケーションごとに1つのファイルになるので、例えばアプリケーション名がRailsAppならばRailsApp.confなどとする。
#!/bin/sh
description "Rails Application"
start on runlevel [2345]
script
app_root=/var/www/rails_application
rbenv_bin=/usr/share/rbenv/versions/ree-1.8.7-2011.12/bin
cd $app_root && $rbenv_bin/bundle exec $rbenv_bin/unicorn_rails -c
$app_root/config/unicorn.conf.rb -e production $app_root/config.ru >> /tmp/upstart.log 2>&1
end script
respawn
このアプリケーションの起動や終了はLinuxの場合ディストリビューションによって変わるが、大体の場合以下のようなコマンドで実行できるので自分の環境に最適なものを選択する。
# 起動
$ sudo service railsapp start
# または
$ sudo initctl start railsapp
# 終了
$ sudo service railsapp stop
# または
$ sudo initctl stop railsapp
UpstartはUbuntu10.04、CentOS6、Amazon Linuxなどで使える。従来の/etc/init.d/以下にあるようなスクリプトよりだいぶシンプルに書けるので積極的に使っている。他にもいろいろとメリットがあるらしいが、正直よくわからない。