nginxで実行されている3つの雑種のクラスターがあり、Capistrano2.4.3を使用してアプリをデプロイします。実行中のシステムがあるときに「キャップデプロイ」すると、動作は次のようになります。
- アプリがデプロイされます。コードは正常に更新されました。
cap deployの出力には、次のものがあります。
- "sudo -p'sudo password:' mongrel_rails cluster :: restart-C/var/www/rails/myapp/current/config/mongrel_cluster.yml"を実行しています
- サーバー:["myip"]
- [myip]コマンドの実行
- ** [out::myip]ポート9096を停止します
- ** [out::myip]ポート9097を停止します
- ** [out::myip]ポート9098を停止します
- ** [out::myip]はすでにポート9096を開始しています
- ** [out::myip]はすでにポート9097を開始しています
- ** [out::myip]はすでにポート9098を開始しています
- サーバーをすぐに確認すると、Mongrelがまだ実行中であり、前の3つのインスタンスのPIDファイルがまだ存在していることがわかります。
- しばらくして(1分未満)、Mongrelが実行されなくなり、PIDファイルがなくなり、再起動に失敗しました。
- サーバー上で手動で雑種犬を起動すると、アプリは正常に起動します。
'mongrel_rails cluster :: restart'は、クラスターの再起動を試みる前に、完全な停止を適切に待機していないようです。この問題を診断して修正するにはどうすればよいですか?
編集:答えは次のとおりです。
mongrel_clusterは、「再起動」タスクで、これを実行するだけです。
def run
stop
start
end
「開始」を呼び出す前に、プロセスが終了したことを確認するための待機やチェックは行いません。これは、未解決のパッチが提出された既知のバグです。パッチをMongrelClusterに適用すると、問題は解消されました。