« JiftyでWebアプリをつくる - ログイン機能を作る | メイン | SWFAddress2.0を利用した「状態」による機能制御 »

capistrano で本番環境にデプロイはてなブックマークに追加 livedoorクリップに追加 Yahoo!ブックマークに追加 del.icio.usに追加 イザ!ブックマーク ニフティクリップに追加

Ruby(とRails)を担当している石原です。

ソーシャル「OSを入れた後にインストールする10のアプリケーション」(仮) を作る過程をレポートしています。

これまでのエントリーはこちら ↓

  1. つくるぶガイドブログ: Ruby on Rails を使ってひとりでサービスを作ってみよう
  2. つくるぶガイドブログ: ひとりサービスの雛型をつくる(リキッドレイアウト、GetText、Acts as Authenticated)
  3. つくるぶガイドブログ: Rails で楽々ソーシャルブックマークの仕組みを作る
  4. つくるぶガイドブログ: Rails プラグイン acts_as_taggable_redux でタグクラウドを作ろう
  5. つくるぶガイドブログ: ドラッグアンドドロップで並べ替え(Rails + Ajax)
  6. つくるぶガイドブログ: Rails + rcov でテストカバレッジを調べる

まだ開発途中ではありますが、今回はアプリケーションを本番環境にデプロイしてしまおうと思います。

開発環境で開発したアプリケーションを本番環境に移すデプロイの作業は、それぞれの環境によって千差万別なやりかたがあるため、ときにはかなりてこずることがあります。

リリース間際ではなく、なるべく早い段階で本番環境でも開発環境と同じように動くことを確認しておくと安心です。

capistrano はデプロイの作業を楽にしてくれるおすすめのツールです。

» Capistrano: Home

本番環境には筆者が契約している VPS(Cent OS 5) を例に、capistrano のデプロイ作業の流れを紹介します。

アプリケーションサーバーには Mongrel Cluster、Web サーバーには Apache という定番の構成をとることにします。

capistrano の前に。前提条件

capistrano を使ってデプロイする前に、必要なソフトウェアやミドルウェアを本番環境となるサーバーにインストールしておく必要があります。

筆者が実際にインストールしたものを列挙します。それぞれのインストール方法は割愛させていただきます。

  • ruby 1.8.6
  • rubygems 1.0.1

まずは ruby と rubygems です。これがないと始まりません。

  • Apache 2.2.6
  • MySQL 5.0.27

Apache や MySQL はホスティングサーバーに始めから用意されているかもしれません。ただ Apache に関しては、後述する mongrel cluster との連携のためには、ある程度新しいバージョンのものが必要です。

以上が用意できたら必要な gem ライブラリをインストールしていきます。

  • rails 1.2.6
  • gettext 1.10.0
  • mongrel 1.1.3
  • mongrel_cluster 1.0.5

これらは以下のコマンド一発でインストール可能なので、次々インストールしていきましょう。

sudo gem install [ライブラリ名]

開発環境に capistrano をインストール

capistrano は開発環境からコマンド一発で、最新のソースコードを本番環境に配置したり、データベースのマイグレーションやサーバープロセスの再起動をおこなってくれるツールです。

これらのタスクはそれぞれ、本番環境にログインして手動でおこなえる些細なタスクではありますが、ちょっとでもミスをすると実際に動いているサービスに影響がでてしまいます。

ぜひとも自動化してしまうことをおすすめします。

capistrano は開発環境で使用するので、ローカルのマシンに

sudo gem install capistrano

でインストールします。

Rails アプリケーションのトップフォルダにて

capify .

を実行すると、config フォルダの下に deploy.rb という capistrano 用の設定ファイルが出来ます。

この deploy.rb を以下のように編集します。

それぞれの説明を赤字でコメント文として追加しました。


require 'mongrel_cluster/recipes'
# Mongrel に関連した capistrano コマンドが使えるようになります
set :application, "10best" # アプリケーションの名前
set :repository,  "http://10best.googlecode.com/svn/trunk" # subversion のレポジトリ
set :user, "app" # 本番環境に ssh でアクセスするときのログイン名
set :mongrel_conf, "#{current_path}/config/mongrel_cluster.yml" # mongrel_cluster 設定ファイル
set :mongrel_clean, true # mongrel を再起動するとき、残ってしまったプロセスをクリアします

# If you aren't deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
# set :deploy_to, "/var/www/#{application}" 
# 本番環境のデプロイ先のパス。何も指定しない場合 /u/apps/[アプリ名] にデプロイされます

# If you aren't using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion

role :app, "10best.champierre.com" # 本番環境ホスト名(アプリケーションサーバー)
role :web, "10best.champierre.com" # 本番環境ホスト名(Webサーバー)
role :db,  "10best.champierre.com", :primary => true # 本番環境ホスト名(DBサーバー)

# http://www.hostingrails.com/forums/deployment_troubleshooting_thread/665
default_run_options[:pty] = true 
# capistrano コマンド実行中、パスワード入力の部分でうまく動作しない場合、これを入れると直る場合があります

mongrel cluster の設定ファイルを作成するためにローカルマシンにも mongrel をインストールしておきます。

sudo gem install mongrel

以下のコマンドを実行すれば、config フォルダに mongrel cluster の設定が書かれた mongrel_cluster.yml が作成されます。

mongrel_rails cluster::configure -e production -p 8000 -a 127.0.0.1 -N 3 -c /u/apps/10best/current

cap コマンドで簡単デプロイ

いよいよデプロイです。

capistrano のコマンドは cap で始まります。rake のように、

cap -T

で、使用できるコマンドの一覧を表示できます。

まずは

cap deploy:setup

を実行してみましょう。

これで本番環境のデプロイ先に必要なディレクトリが作成されます。今回の例では、/u/apps/ の下に 10best というフォルダが作成されます。

作成されないときは、ssh ログインユーザーに指定されているユーザーが u や apps に対して書き込み権限を持っているかどうか確認しましょう。

ちゃんと作成されているようであれば、

cap deploy:cold

を実行します。ソースコードをレポジトリよりチェックアウトし、データベースのマイグレーションをおこない、mongrel を起動します。

なかなか一発ではうまく完了しないと思います。その場合には、capistrano が何をおこなおうとして失敗したかがエラーとして表示されますので、本番環境にログインしてみて、同じコマンドを実行してみると問題と解決方法を発見しやすいかと思います。

すべてのコマンドがうまく実行できたら、本番環境でアプリケーションが動作しているはずです。

といってもまだ外からアクセスできないので、本番環境上でたとえば

lynx http://localhost:8000

とテキストブラウザでアクセスしてみて動作していることを確認します。

Apache と Mongrel を連携させる

最後に Apache と Mongrel を接続して、外からもアプリケーションにアクセスできるようにします。

Apache の設定ファイルに

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

があって、mod_proxy と mod_proxy_balancer が使えることを確認してください。

httpd.conf を以下の通り編集します。


ProxyRequests Off

DocumentRoot /u/apps/10best/current/public

<Directory "/u/apps/10best/current/public">
  Options FollowSymLinks
  AllowOverride None
  Order allow,deny
  Allow from all
</Directory>

ProxyPass /images !
ProxyPass /stylesheets !
ProxyPass /javascripts !

ProxyPass / balancer://railsapp/
ProxyPassReverse / balancer://railsapp/
<Proxy balancer://railsapp>
  BalancerMember http://127.0.0.1:8000 loadfactor=20
  BalancerMember http://127.0.0.1:8001 loadfactor=20
  BalancerMember http://127.0.0.1:8002 loadfactor=20
</Proxy>

Apache を再起動後、外部からもアプリケーションにアクセスできることを確認します。

まとめ

capistrano を使って本番環境にデプロイしました。

今回ソースコードにほとんど更新はありませんが、ここまでのソースコードをアップロードしておきます。

» 10best - Google Code


svn checkout http://10best.googlecode.com/svn/trunk/ 10best

でチェックアウトするか、ブラウザでもリポジトリを閲覧することができます。

トラックバック

必ず利用規約をお読み頂き、同意の上、送信してください。
また、トラックバック元・リンク先の内容にはリクルートは一切責任を負いません。

この一覧は、次のエントリーを参照しています: capistrano で本番環境にデプロイ:

» capistrano, mongrel_clusterで小ハマリ 送信元 p0t
mod_proxy_balancer + mongrel_clusterを使った... [詳しくはこちら]