第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.yml と spin を正しいディレクトリにコピーして、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:start を deploy:stop に変えれば停止、deploy:restart に変えれば再起動である。
さて、アプリケーションの運用が始まると、マイグレーションの伴わない細かい修正を繰り返し行うことになるので、deploy:update タスクとdeploy:restart タスクの組み合わせを使う頻度が多くなる。そこで、この2つのタスクを順に行う deploy タスクが用意されている。したがって、アプリケーションに修正を加えたら、単にローカルホストで次のコマンドを入力して、ソースコードの更新とアプリケーションの再起動を一度に行えばよい:
% cap deploy
変数 svn_user をセットする場合は、次のようになる。
% svn_user=kuroda cap -q deploy
