Apacheのmod_proxy_balancerを使うときはretryを設定すべき

 今作っているサービスは、Apacheのmod_proxy_balancerを使ってロードバランシングしている。しかし、バックエンドのサービスサーバを一旦落としてから復帰させると、コネクションがしばらくつながらないという問題に悩んでいた。1分ぐらい放置するとつながるようになるんだけど、1分は結構長い。
 よくわからないのでソースを読んでみたところ、mod_proxy_balancer.cを眺めた感じ、ap_proxy_retry_workerという関数がコネクションの再確立をしているのではないかと思えた。しかし、関数の定義を眺めてみると、現在時刻がエラー発生時刻とworker->retryを足した数字よりも大きければworkerのstatusからPROXY_WORKER_IN_ERRORのビットを下ろしているだけで、コネクションの確立がどうのこうのなんて関数はまったく呼ばれてない。ここでなにがなんだかわからなくなってしまいしばらく頭を抱えてしまった。かなり悩んだが、結局、statusがPROXY_WORKER_IN_ERRORの間はエラー状態ということでコネクションの再接続をしないので、タイムアウト時間が経過したらそのビットを下ろしているんだと気づいた。
 そこまでわかれば、あとはどこでworker->retryを設定するのかを調べればいい。"mod_proxy_balancer retry"でぐぐったらmod_proxy_balancerのretryというエントリが一番上に出てきて、その記述通りBalancerMemberにretry=3というオプションを追加して試してみると、めでたく問題は解決した。
 しかし、mod_proxyのマニュアルにあるようにProxyPassのところでretryを設定しても動かないし、mod_proxy_balancerのページにはretryとかtimeoutとかの設定の話は書いてないし、どこら辺を読めばこういう事が書いてあるのかよくわからなかった。たぶん、どこか知らないといけないサイトを知ってないんだろうなという気がする。
 その他、mod_proxyの問題に関しては、 既知の問題およびHowToまとめのエントリが参考になった。現在では解決している問題も多いけれど、一度目を通しておいて損はない。