mod_proxy の retry に関して

いろいろと混乱したのでメモ

仕事で mod_proxy_balancer を利用したロードバランシングを利用しています。
複数台あるバックエンドへのデプロイは、Jenkins を利用して順次APサーバを停止して行なっています。
この作業中にブラウザでアクセスをしてみると、たまに503エラーページに出くわすことがありました。

これを、apache がバックエンドがデプロイ中であることに気づかずに振り分けが続いているのかと想像しました。
頻繁にデプロイするわけではないためクリティカルな問題では無いのですが、少し気持ちが悪いのでどうにかならないか調べてみました。

ドキュメントを読んでみると、retry という設定項目がありました。

コネクションをプーリングするための、リトライのタイムアウトを秒で 指定します。バックエンドサーバへのコネクションプーリングが失敗した場合は、 タイムアウトの期間が過ぎるまで、そのサーバにリクエストをフォワードしません。 この機能を使うと、バックエンドサーバをメンテナンスのためにシャットダウンし、 後でオンラインに復帰させるといったことができます。 0 を指定すると、失敗したワーカーへ、タイムアウト無しで常にリトライします。

http://httpd.apache.org/docs/2.2/ja/mod/mod_proxy.html#proxypass

これを読む限り、apache はバックエンドへの接続に失敗した後60秒待ち、その後振り分けを再開するということのようです。
このため、振り分けが再開された時点でバックエンドが起動していないと503エラーが発生しているようです。