よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

Passenger + monit でリリース作業をより簡単にする方法

PassengerでRAILSアプリを運用しているなら、アプリのリリース時には、${RAILS_ROOT}/tmp/restart.txt を配置/更新することで、ほぼダウンタイム無し(httpdの再起動なしのため)にリリースしているかと思います。

ただ、アプリケーションのソースコードの影響範囲が、Railsアプリのみだけなら、restart.txtの仕組みだけでよいかもしれません。しかし、パフォーマンスを考慮し非同期処理を行うためにdelayed_jobを利用していたり、メール送信流量を制限するためにar_sendmailなどを利用している場合は、それぞれのデーモンの再起動を行う必要があります。
#delayed_jobについては、id:mat_aki(@mat_aki)が紹介している「Railsで非同期処理を行うには"Delayed_job"がおすすめ」がわかりやすいと思います。

そのため、アプリのソースコードを最新化した後に、delayed_jobやar_sendmailのデーモンをわざわざ再起動しているかもしれませんが、軽量なリソース/プロセスなどの監視デーモンであるmonitのリソース監視の仕組みを利用すれば、restart.txtを更新するだけで済むようにできます。

例えば、${RAILS_ROOT}"/var/www/APPS"で、delayed_jobを利用していたとします。
このときのmonitの設定は以下のようになります。

check file restart.txt path /var/www/APPS/tmp/restart.txt
    start program = "/bin/touch /var/www/APPS/tmp/restart.txt"
    if changed timestamp then exec "/etc/init.d/delayed_job restart"

1行目で、restart.txtのファイルを監視対象としています。
そして2行目では、restart.txtが存在しなかった場合にrestart.txtを生成しています。#この2行目は必須ではありません。
最後の3行目でrestart.txtのタイムスタンプが変化したかどうかをチェックし、更新されていればexecの後に書いているコマンドを実行します。

このようにアプリのリリース時に再起動しなければならないようなデーモンがある場合にmonitにデーモンの再起動を任せることで、リリース作業を簡単にしたり、さらにはデーモンの再起動忘れを防ぐことができます。

また、id:rx7が紹介している「Passengerで${RAILS_ROOT}/tmp/stop.txt配置時にメンテナンス画面」なども組み合わせると、リリース時に簡単にメンテナンス画面を表示することもできますね。