第7回 Rails アプリケーションの起動・停止・再起動

2008/05/17

今回は、Rails アプリケーションの起動・停止・再起動を行う。

第1回 インストールに書いたように、Rails アプリケーションは Mongrel 1.1.4 の上で動かすというのが、この連載の前提条件だ。

まず、リモートホストにインストールされている RubyGems のバージョンを確認しよう。

$ gem --version
1.1.1

まだ RubyGems がインストールされていなければ、RybyForge から最新版をダウンロードして、インストールする。

$ wget http://rubyforge.org/frs/download.php/35283/rubygems-1.1.1.tgz
$ tar xzf rubygems-1.1.1.tgz
$ cd rubygems-1.1.1
$ sudo ruby setup.rb

バージョンが古いだけなら、アップデートする。

$ sudo gem update --system

次に、Mongrel のバージョンを確認する。

$ gem list mongrel

*** LOCAL GEMS ***

mongrel (1.1.4)
mongrel_cluster (1.0.5)

もし何も表示されないか Mongrel のバージョンが古い場合はインストールする。

$ sudo gem install mongrel

同様に mongrel_cluster もインストールする。

$ sudo gem install mongrel_cluster

本番用の database.yml を用意する(サンプルコードは省略)。

$ cd /var/rails/ballad/shared
$ sudo -u app mkdir config
$ sudo -u app vi config/database.yml

spin スクリプトを用意する。

$ sudo -u app mkdir script
$ sudo -u app vi script/spin

spin スクリプトの中身は、例えば次のようになる:

#!/bin/sh
/var/rails/ballad/current/script/process/spawner -p 3000 -i 4

-p オプションにはポート番号、-i オプションには mongrel インスタンスの数を指定する。上記の例では、3000番から3003番までのポートを使って4個の mongrel インスタンスが起動する。なお、-e オプションで「実行環境(development|test|production)」を指定できるが、デフォルトは production なので、普通は指定しなくてもよい。


ローカルホストに戻って、config/deploy.rb に次の記述を追加する:

desc "Copy shared config files to current application."
task :after_update_code, :roles => :app do
  run "cp -f #{shared_path}/config/database.yml #{release_path}/config/"
  run "cp -f #{shared_path}/script/spin #{release_path}/script/"
  run "chmod u+x #{release_path}/script/spin"
end

この after_update_code タスクは、update_code タスクの後に自動的に実行される。その中身は、database.ymlspin を正しいディレクトリにコピーして、spin スクリプトに実行パーミッションを与えるというものだ。

では、ここで deploy:update タスクを実行してみよう。/var/rails/ballad/current/script ディレクトリに spin ファイルができていれば OK だ。


次に、データベースの準備をする。ただし、データベース管理システムのインストールは終わっているとする。

まず、リモートホストにログインしてデータベースを作成する:

$ rake db:create RAILS_ENV=production

次にマイグレーション。普通に rake db:migrate RAILS_ENV=production を実行してもいいが、せっかくなのでローカルホストから Capistrano で実行する:

% cap deploy:migrate

これで準備完了。Rails アプリケーションを起動できる。

% cap deploy:start
  * executing `deploy:start'
  * executing "sh -c 'cd /var/rails/ballad/current && nohup script/spin'"
    servers: ["alpha.oiax.jp"]
    [alpha.oiax.jp] executing command
 ** [out :: alpha.oiax.jp] => Starting mongrel dispatchers
 ** [out :: alpha.oiax.jp] Checking if something is already running on 0.0.0.0:3000...NO
 ** [out :: alpha.oiax.jp] Starting dispatcher on port: 0.0.0.0:3000
 ** [out :: alpha.oiax.jp] Checking if something is already running on 0.0.0.0:3001...NO
 ** [out :: alpha.oiax.jp] Starting dispatcher on port: 0.0.0.0:3001
 ** [out :: alpha.oiax.jp] Checking if something is already running on 0.0.0.0:3002...NO
 ** [out :: alpha.oiax.jp] Starting dispatcher on port: 0.0.0.0:3002
 ** [out :: alpha.oiax.jp] Checking if something is already running on 0.0.0.0:3003...NO
 ** [out :: alpha.oiax.jp] Starting dispatcher on port: 0.0.0.0:3003
    command finished

deploy:startdeploy:stop に変えれば停止、deploy:restart に変えれば再起動である。


さて、アプリケーションの運用が始まると、マイグレーションの伴わない細かい修正を繰り返し行うことになるので、deploy:update タスクとdeploy:restart タスクの組み合わせを使う頻度が多くなる。そこで、この2つのタスクを順に行う deploy タスクが用意されている。したがって、アプリケーションに修正を加えたら、単にローカルホストで次のコマンドを入力して、ソースコードの更新とアプリケーションの再起動を一度に行えばよい:

% cap deploy

変数 svn_user をセットする場合は、次のようになる。

% svn_user=kuroda cap -q deploy