ノウハウ
[エンジニア向け]

Apacheモジュールでロードバランシング&セッション維持!「Mod proxy balancer」と「stickysession」

ノウハウ

start

こんにちは。
今回はApacheモジュール「mod proxy balancer」でセッションを維持しながらロードバランシングできる方法をご紹介したいと思います。セッションの仕様上、セッションのデータがサーバ側に残るため、毎回振り分け先の変わりうるロードバランサーの環境では、通常はセッションの利用ができません。

ロードバランサーとしての実用性はLVS等の方が安定するかと思いますが、気軽にロードバランサーを試すことができます。また、ロードバランシングしながらのセッション維持も行えるため、ログインする必要のあるサイト構築の運用も可能です。
(筆者自身では正常に動作しましたが、動作保証しかねますことをご了承ください。)

大まかな説明

1.初めて接続 or CookieやGET/POSTデータがない場合
(通常のロードバランサーとして使う場合)

new

初めて接続する場合やCookieやGET/POSTデータを扱わない場合は、通常のロードバランサーの働きをします。

2.GET/POSTがある場合

GETPOST

アクセスする際にGET/POSTデータを付加してアクセスした場合は、GET/POSTデータに従ったWEBサーバに振り分けられます。

3.Cookieがある場合

COOKIE

Cookieを保持していた場合もGET/POSTの時と同様に、指定されたWEBサーバに振り分けられます。

※2と3の画像でロードバランサーの態度に差がありますが、実際の挙動は変わりません。

設定例(Cookieでの振り分けの場合)

検証環境
EX-CLOUD クラウドプランスタンダード1u 3台
(ロードバランサー用1台(Apache必要) + WEBサーバ2台)
※今回はクラウドプランで試しましたが、EX-LITEでも可能です。
※Plesk有りの場合はPleskのアップデート時に設定が無効になる場合があります。

1. ロードバランサーのApacheモジュールに「mod_proxy」と「mod_proxy_balancer」が入っていることを確認します。

# cat /etc/httpd/conf/httpd.conf |grep proxy
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so

もしくは

# httpd -M

で調べられます。

2.ロードバランサー用サーバーの/etc/httpd/conf.d/にsticky.confを作成して、以下を記述します。

#sticky.confの中身

#sticky.confのsessidはcookie or GET/POSTメソッドの変数名。振り分ける際に使用する。
ProxyPass / balancer://link/ stickysession=sessid

#BalancerMemberにぶら下げるWEBサーバを設定する。
#BalancerMember WebサーバのURL 重み付け(振り分けの比率) WEBサーバのIDのようなもの(任意)
BalancerMember http://1.1.1.1/ loadfactor=10 route=a
BalancerMember http://1.1.1.2/ loadfactor=20 route=b

3.ロードバランサーのApacheを再起動します。

4.WEB1、WEB2に以下のようなhtmlファイルを作成します。


<meta charset="UTF-8" />
<script type="text/javascript">// <![CDATA[
function set(){
        document.cookie = 'sessid=1234567890.a';
        //sessidはロードバランサーで変数名として指定したもの
        //1234567890は任意のもので、WEB1、WEB2共通にする
        //aはロードバランサーでroute=に指定したもの。前に「.」をつける

        alert("sessid保存しました。");
}

function reset(){
        var date = new Date();
        date.setTime(0);
        document.cookie = "sessid=;expires="+date.toGMTString();
        alert("sessidリセットしました。");
}
// ]]></script>

サーバ1です。

<!--WEB2の場合は「サーバー2です。」と書きます。 -->
<input onclick="set();" type="submit" value="保存" />
<input onclick="reset();" type="submit" value="リセット" />

保存を押さずに更新を押すと分散されます。

保存を押すとアクセス先サーバが固定されます。

リセットするとデフォルトに戻り分散されます。

5.ロードバランサーのドメインかIPアドレスにアクセス。

上記の設定ではセッションを実装していませんが、ロードバランサーでの振り分け先を指定できるため、セッション維持を行うことができます。

(実用性を持たせるには詳細な設定が必要ですが・・・)手軽にロードバランサーが試せるので、ぜひお試しください!

この記事を書いた人

橘です。データの集計を行ったり、IoT関連のいろいろをやっています。 IoT女子の文明を作るための技術的サポートを行ったり、 個人的にブログでPythonを書いたりしています。

この記事のタグ

オススメの記事

この記事を読んだ人にオススメのサービス

エクスクラウドのクラウドVPS

【月額700円~】クラウドのような柔軟性と拡張性をかねそなえた格安クラウドVPS。メモリ最大48GBまで無停止でスケールアップ可能。まずは14日間無料でお試しください♪

ページトップへ