とりあえずはてなの中の人が見付けたバグの再現をとってみた。
焦点はBugzillaの40910に該当する問題なのかどうか。
試した設定は以下の通り。全てのバージョンのApacheで(ServerRoot以外)全く同じものを用いている。
以下関係するホスト。
balancer0(192.168.50.10), worker1(192.168.50.11), worker2(192.168.50.12), worker11(192.168.50.111)
各々のホストのDocumentRoot
には hostname.txt が置いてあって、中身はホスト名が書かれているだけ。
ProxyPass /r1/ balancer://testcluster1/ stickysession=SESSID
ProxyPass /r2/ balancer://testcluster2/ stickysession=SESSID
<Proxy balancer://testcluster1>
BalancerMember http://worker1 loadfactor=10 route=w01
BalancerMember http://worker2 loadfactor=10 route=w02
</Proxy>
<Proxy balancer://testcluster2>
BalancerMember http://worker11 loadfactor=10 route=w11
</Proxy>
結果は以下の通り。
- 2.2.3
- configtestの結果: Syntax OK のみ
/r2/hostname.txt
にアクセスしても worker1 に配送されてしまう
- URIパラメータにより
SESSID=HOGEHOGE.w11
を指定してもworker1に行く
- バランサーの設定記述順序を逆にし worker11 を worker1 の前に記述すると正しく動作する
- 2.2.4
- trunk
- configtestの結果:Syntax OK のみ
/r2/hostname.txt
にアクセスすると、正しく worker11 に配送される
- trunk のソースに対してBugzillaの40910のパッチによる修正箇所をコメントアウトしたもの
- configtestの結果:以下のwarningが出力される
[warn] worker http://worker1 already used by another worker
ということで、目星をつけた修正がこの問題に対応していることが確認できた。
対処法としては以下の通り。
- trunkを使う
- 2.2.4 に該当パッチを当てる
- MLに2.2.xにもbackportしてよとお願いする
- 設定ファイルを書く場合には順序に注意しましょう
- 果てしなくバッドノウハウくさい
- しかもバランサー毎にファイルが分かれていたりすると茨の道
ホスト名・IPアドレス表記・ポート番号指定などが全て影響を受けるので、みなさん注意しましょう。