2007.05.14 Monday
mod_proxy_balancer と ajp と stickysession
設定ファイルが煩雑でメンテナンスされてない JK2 を使うのにもいい加減疲れてきた今日この頃。
新規に Webサーバを立てる機会があったので Apache 2.2.4 + mod_proxy_ajp な環境に変更することにしました。
--enable-proxy --enable-proxy-ajp で Proxy関連のモジュールを使えるように Apache を構築して起動。
Apache から Tomcat への接続は httpd.conf に 1行書くだけで簡単に設定できます。
ロードバランスさせるには mod_proxy_balancer と組み合わせて以下のように定義することで可能。
balancer定義の最後のスラッシュが無いとサブディレクトリにアクセスした再に 403 Forbidden が返ってくるようですので, 付けておいたほうが無難ですね。
これでロードバランスはされるようになりますが, セッションを使っている場合は引き継がれるようにしなければなりません。
新規に Webサーバを立てる機会があったので Apache 2.2.4 + mod_proxy_ajp な環境に変更することにしました。
--enable-proxy --enable-proxy-ajp で Proxy関連のモジュールを使えるように Apache を構築して起動。
Apache から Tomcat への接続は httpd.conf に 1行書くだけで簡単に設定できます。
ProxyPass /hoge/ ajp://host1:8009/hoge/
ロードバランスさせるには mod_proxy_balancer と組み合わせて以下のように定義することで可能。
ProxyPass /hoge/ balancer://hoge/
<Proxy balancer://hoge/>
BalancerMember ajp://host1:8009/hoge/ loadfactor=10
BalancerMember ajp://host2:8009/hoge/ loadfactor=10
</Proxy>
balancer定義の最後のスラッシュが無いとサブディレクトリにアクセスした再に 403 Forbidden が返ってくるようですので, 付けておいたほうが無難ですね。
これでロードバランスはされるようになりますが, セッションを使っている場合は引き継がれるようにしなければなりません。
セッションの引継ぎには stickysession と route の指定が必要です。
JK2 から移行する場合は以下のように定義してやれば動作します。
route の値は, 各Tomcatサーバの jvmRoute の値を指定します。
これでセッションが発行されると, 以後そのセッションが有効な間は同一サーバへリクエストが投げられます。
JK2 からの移行はこれだけで完了です。簡単簡単。
ただ, PHP等でこの stickysession を利用しようとすると一工夫必要です。
セッションを発行する際, 自前でセッション発行元を判別する文字列(routeですね)をセッション文字列に付加してやらなければなりません。
mod_proxy_balancer は stickysession で指定した変数の値のピリオド以降の文字列を route とするサーバにリクエストを割り振ります。
うーむ, 言葉で書くと訳分かりませんねぇ(;´Д`)
上の例で言うと,
JSESSIONID=hogefuganya.host1
だと host1 へ,
JSESSIONID=hogefuganya.host2
だと host2 へリクエストが投げられます。
Tomcatでセッション(JSESSIONID)が発行される場合, <セッションID>.<jvmRoute> という値が生成されるので, あまり意識することなく上記の設定ですんなり動作するんですね。
stickysession のこの仕様は, Tomcat + JK2 を意識して作られているような気がします(JK は使ったことがないから分かりません)。
PHP だと NFS や memcached 等でセッション共有してしまって stickysession は使わないというやり方の方がしっくり来るかも知れませんね。
新たにセッション用のサーバを作って運用するのが面倒という場合は, route を判別できるようにセッションID を発行するような仕組みを自前で用意しましょう。
そのうちいいライブラリができるかも?
参考:
ウェブ アルチザン ブログ > mod_proxy_balancerの設定、特にstickysessionについて
JK2 から移行する場合は以下のように定義してやれば動作します。
ProxyPass /hoge/ balancer://hoge/ stickysession=JSESSIONID
<Proxy balancer://hoge/>
BalancerMember ajp://host1:8009/hoge/ loadfactor=10 route=host1
BalancerMember ajp://host2:8009/hoge/ loadfactor=10 route=host2
</Proxy>
route の値は, 各Tomcatサーバの jvmRoute の値を指定します。
これでセッションが発行されると, 以後そのセッションが有効な間は同一サーバへリクエストが投げられます。
JK2 からの移行はこれだけで完了です。簡単簡単。
ただ, PHP等でこの stickysession を利用しようとすると一工夫必要です。
セッションを発行する際, 自前でセッション発行元を判別する文字列(routeですね)をセッション文字列に付加してやらなければなりません。
mod_proxy_balancer は stickysession で指定した変数の値のピリオド以降の文字列を route とするサーバにリクエストを割り振ります。
うーむ, 言葉で書くと訳分かりませんねぇ(;´Д`)
上の例で言うと,
JSESSIONID=hogefuganya.host1
だと host1 へ,
JSESSIONID=hogefuganya.host2
だと host2 へリクエストが投げられます。
Tomcatでセッション(JSESSIONID)が発行される場合, <セッションID>.<jvmRoute> という値が生成されるので, あまり意識することなく上記の設定ですんなり動作するんですね。
stickysession のこの仕様は, Tomcat + JK2 を意識して作られているような気がします(JK は使ったことがないから分かりません)。
PHP だと NFS や memcached 等でセッション共有してしまって stickysession は使わないというやり方の方がしっくり来るかも知れませんね。
新たにセッション用のサーバを作って運用するのが面倒という場合は, route を判別できるようにセッションID を発行するような仕組みを自前で用意しましょう。
そのうちいいライブラリができるかも?
参考:
ウェブ アルチザン ブログ > mod_proxy_balancerの設定、特にstickysessionについて









Comments