間違ったworkerに配送されるバグの確認
とりあえずはてなの中の人が見付けたバグの再現をとってみた。
焦点は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に行く
- URIパラメータにより
- バランサーの設定記述順序を逆にし worker11 を worker1 の前に記述すると正しく動作する
- 2.2.4
- 2.2.3と完全に同様
- trunk
- configtestの結果:Syntax OK のみ
/r2/hostname.txt
にアクセスすると、正しく worker11 に配送される
- trunk のソースに対してBugzillaの40910のパッチによる修正箇所をコメントアウトしたもの
- configtestの結果:以下のwarningが出力される
[warn] worker http://worker1 already used by another worker
-
- 動作自体は2.2.3および2.2.4と同様
ということで、目星をつけた修正がこの問題に対応していることが確認できた。
対処法としては以下の通り。
- trunkを使う
- 普通無理だよなあ
- 2.2.4 に該当パッチを当てる
- それもどうかと
- MLに2.2.xにもbackportしてよとお願いする
- 誰か(ぇー
- 設定ファイルを書く場合には順序に注意しましょう
- 果てしなくバッドノウハウくさい
- しかもバランサー毎にファイルが分かれていたりすると茨の道
ホスト名・IPアドレス表記・ポート番号指定などが全て影響を受けるので、みなさん注意しましょう。