Linux
冗長化
Apache2.4

ロードバランサ(Apache2.4)でセッション維持する

目的

ロードバランサ(LB)の後ろにWebサーバを複数台おいて負荷分散する構成で、セッションを維持したい。なんの仕掛けもなしに毎回異なるWebサーバにアクセスすると会話が成立しない。

conf.PNG

方針

  • LBの機能を利用してアクセス先のWebサーバを固定する。
    • LBでアクセス先のサーバを固定せず、Webサーバ間でセッションの情報を共有する方式(セッションレプリケーション)もあるが、スコープ外。
  • Nginxの方がパフォーマンスはよさげ。でも有償。今回はApacheを利用してみる。
    • ハードウェアのLBは高価。今回はソフトウェアで実装する。
    • L4じゃ物足りないのでL7に対応したソフトウェアを採用する。
  • stickysessionパラメータを利用する。

利用するモジュール

mod_proxy
mod_proxy_balancer
mod_proxy_http
mod_setenvif
mod_headers
など

設定例

LBの設定

ProxyPass / balancer://mycluster stickysession=SESSIONID nofailover=On
<Proxy balancer://mycluster>
    BalancerMember http://1.2.3.4:8009 route=1
    BalancerMember http://1.2.3.5:8009 route=2
</Proxy>

Webの設定

Header add Set-Cookie "SESSIONID=.1"

もう一方のWebサーバは、SESSIONID=.2 とする。
以下の様に、条件付きでSESSIONIDを設定してもいいかも。

SetEnvIf Cookie "SESSIONID=" HAS_SESSID
Header add Set-Cookie "SESSIONID=.1" env=!HAS_SESSID

メモ

  • SESSIONID=.1の時、http://1.2.3.4:8009にアクセスする。
  • SESSIONID=.2の時、http://1.2.3.5:8009にアクセスする。
  • 上記はWebサーバの設定でSESSIONIDをセットする例。アプリケーションでセットしてもいいんだと思う。
    • SetEnvIf について上記の例では、HTTPリクエストのCookie属性に"SESSIONID="が含まれる場合、HAS_SESSIDという環境変数に1をセットする(valueを指定しないと1をセットする)。
    • Header について上記の例では、HTTPレスポンスのSet-Cookie属性に"SESSIONID=.1"をセットする。
    • env=!○○ により、○○という環境変数が設定されていない場合は、Header云々を適用する。
    • Set-Cookie: cookie-name=cookie-value でサーバはクライアントにCookieを保存するよう求める。
  • ちなみに、Apacheの環境変数をログに出力するには、LogFormatに%{○○}eを指定する。
    • Apacheの環境変数とOSの環境変数は別物。
    • HTTPヘッダに環境変数は現れない。(仕様確認なし、目視確認のみ)
  • 上記の例では、SESSIONIDに固定値をセットしたが、BALANCER_WORKER_ROUTEを利用してもよい。また、!HAS_SESSIDの代わりにBALANCER_WORKER_ROUTEを利用してもよい。
  • mod_proxyはURLかCookieを対象に、stickysessionに指定された値を探しに行くのかしら。(推測)
  • まとめると、処理の流れは以下の通り。
    1. クライアントから(LB経由で)WebサーバにHTTPリクエストが届く。
    2. Webサーバは(サーバ毎に異なる)SESSIONIDを発行し、これをcookieに保存するようにクライアントに求めるHTTPレスポンスを返す。
    3. クライアントはサーバからもらったSESSIONIDをcookieにセットしてHTTPリクエストを投げる。
    4. LBはHTTPリクエストを受け取りcookieにセットされたSESSIONIDを参照し、リクエストを転送するWebサーバを決定する。

資料

https://httpd.apache.org/docs/2.4/en/mod/mod_proxy.html
https://httpd.apache.org/docs/2.4/en/mod/mod_proxy_balancer.html
https://httpd.apache.org/docs/2.4/en/mod/mod_setenvif.html
https://httpd.apache.org/docs/2.4/en/mod/mod_headers.html
https://httpd.apache.org/docs/2.4/en/mod/mod_log_config.html
https://developer.mozilla.org/en/docs/Web/HTTP/Cookies

※enをjaに変えれば日本語マニュアルになるけど、日本語の方には書いてないこともあるので、英語版を読んだ方がいい。