CAPISTRANO 2.0 その3

 
2007.10.05  内藤謙一
少し期間が空いてしまいましたが、前回の続きです。

まずproxyの設定ですが、これはすでに櫻井の日記の方で書かれていた(通常は、、のところです)ので、省略させていただきます。要は、apache 2.2の機能であるbalancerを利用しています。

次に、WEBサーバでメンテナンス画面を出す方法を紹介させていただきます。こちらは、deploy.rbファイルの、namespaceで:deploy , :webの下にある、:disableタスクと:enableタスクを修正して、自分の環境に合わせます。私の場合は

    task :disable, :roles => :web, \
:except => { :no_release => true } do
      require 'erb'
      on_rollback { \
run "rm #{shared_path}/system/maintenance.html" }

      reason = ENV['REASON']
      deadline = ENV['UNTIL']

      template = File.read(File.join(File.dirname(__FILE__), \
"..", "maintenance.rhtml"))
      result = ERB.new(template).result(binding)

      put result, "#{shared_path}/system/maintenance.html", \
:mode => 0644

    end

    task :enable, :roles => :web, \
:except => { :no_release => true } do
      run "rm #{shared_path}/system/maintenance.html"

    end

としています。(\で区切られている部分は、実際は一行です。また、reasonやdeadlineは実際には使っていませんが、残しています)
 こうすることで、railsディレクトリ(プロジェクトのソースディレクトリ)にmaintenance.htmlファイルを置いておけば、それがメインテナンス画面となり、次で述べるAPACHEの設定をすることで、
cap deploy:web:disable
を実行するとメインテナンスモードとなって表示され、
cap deploy:web:enable
を実行すると表示されなくなります。

 そして、APACHEの設定ですが、これはhttpd.confなどで、document_rootの設定を本番のrailsのsharedディレクトリに設定した上で、

        RewriteEngine On
        RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
        RewriteCond %{SCRIPT_FILENAME} !maintenance.html
        RewriteRule ^.*$ /system/maintenance.html [L]

と設定しておきます。
(sharedディレクトリに設定したのは、上のdeploy.rbでの設定とあわせるためです)
 こうすれば、無事にメインテナンス画面が表示されるようになります。
 簡単に説明すると、maintenance.htmlファイルが存在する場合は、すべてのアクセスに対してmaintenance.htmlを表示するようにしているだけです。このままだと、メインテナンス画面に画像をつけたりできないので、そこらへんはRewriteの条件を追加して行います。