読者です 読者をやめる 読者になる 読者になる

たごもりすメモ

コードとかその他の話とか。

間違ったworkerに配送されるバグの確認

Apache/mod_proxy

とりあえずはてなの中の人が見付けたバグの再現をとってみた。
焦点は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
    • 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アドレス表記・ポート番号指定などが全て影響を受けるので、みなさん注意しましょう。