第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