Apache - mod_proxy_balancerのセッション管理

Apacheでロードバランサーの設定は出来たもののバックエンドのアクセスログを見ていると、設定した通り均等にバランシングされてはいるものの、セッション維持は機能していない模様。外部からログインなどはしないので、セッション管理は特に必要ではないが設定方法は知っておきたいので調べることに。

バックエンドのWordPressはPHPなので、stickysession=PHPSESSIONIDを設定すればいいのかと思っていましたが、そのためにはアプリケーション側でも対応している必要があるようです。マニュアルには以下の説明があり、わかったようなわからないような…

stickysession バランサーのスティッキーセッション名です。通常はこの値は JSESSIONID や PHPSESSIONID といったものになりますが、この値は バックエンドアプリケーションのサポートするセッションに依存します。

stickysessionの動作についてはこちらのサイトを参考にさせていただきました。バックエンドのアプリケーション側の対応としては、以下の値をCookieまたはURLにセットすれば、mod_proxy_balancerはどのバックエンドサーバにリクエストすればいいのか判断できるようです。

<アプリケーション側で用意した一意のID>.<route値>

route値はBalancerMemberディレクティブで使うパラメータで、バックエンドサーバごとに付与する値です。この値を見てどのバックエンドサーバにリクエストすればいいか判断します。以下はマニュアルの説明です。

route ロードバランサで使った場合、ワーカーのルーティングをします。 ルートはセッション ID に付加された値になります。

できれば今回はApacheだけの設定でセッション維持を実現したい。Apacheだけでセッションを維持するための設定はこちらのサイトが大変参考になりました。Apacheのマニュアルにある以下の設定も参考にして、無事セッションを維持したロードバランスが可能となりました。

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://mycluster>
    BalancerMember http://192.168.1.50:80 route=1
    BalancerMember http://192.168.1.51:80 route=2
    ProxySet stickysession=ROUTEID
</Proxy>
ProxyPass /test balancer://mycluster
ProxyPassReverse /test balancer://mycluster

参考:
http://d.hatena.ne.jp/akahigeg/20070122
http://blog.yappo.jp/yappo/archives/000352.html
http://www.res-system.com/weblog/item/618
http://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass
http://httpd.apache.org/docs/trunk/en/mod/mod_proxy_balancer.html
http://www.hiihah.info/index.php?mod_proxy_balancer%E5%8D%98%E4%BD%93%E3%81%A7stickysession%E3%82%92%E8%A8%AD%E5%AE%9A