複数のWebサーバでロードバランス環境を構築する際には、セッション情報の保持を考慮しなければならない。初期設定のPHPは、セッション情報をファイルとして保持しているため、異なるWebサーバに処理が割り振られるとセッション情報が消失してしまうからだ。こういった環境においてセッションを維持する方法は2つある。
セッション維持方法
- 同じユーザは同じサーバに割り振る
- セッション情報をサーバ間で共有する
1の手法は、Webサーバに手を加えなくて良い反面、Webサーバが故障した場合はセッション情報が失われる。2の方法はセッション情報の共有コストが発生するが、サーバ故障による障害を防げるし、負荷状況に応じて動的にWebサーバの数を増減させることもできる。そこで、2の方法をつかってセッション情報の共有を試してみた。幸い、PHPにはmemcachedを用いたセッション管理機能がある。この機能を適切に設定するだけで、2の方式のセッションを実現できる。
0. 前提知識
- Linuxの操作に習熟していること。
- 自力でLAMP環境をそれっぽく構築できること。
- AmazonEC2のアカウントを所有していること。
- 数十円程度の課金に我慢できること。
1.セキュリティーグループの設定作成
外部から22(SSH)と、80(HTTP)への接続を許可、セキュリティーグループ内で11211(Memcached)の通信を許可。実験にしか使わないなら、22と80は自分のIPだけ許可すると安全。
22 (SSH) 0.0.0.0/0
80 (HTTP) 0.0.0.0/0
2. インスタンスを起動
EC2 DashboardでAmazon Linux AMI 2012.09を2台起動。実験だけならt1.microがお手軽。1時間2円程度。この2台は1で作成したセキュリティーグループに所属させておく。
3. セットアップし単独サーバでの動作確認
php, memcached, 接続モジュールをインストール
/etc/php.iniを編集
#以下の2行をコメントアウト(先頭に;を付与)
session.save_handler = files
session.save_path = "/var/lib/php/session"
/etc/php.d/memcache.iniを編集
#以下の行のコメントアウトを外す(先頭の;を除去)
;session.save_handler=memcache
#以下の行のコメントアウトを外す。?以下は除去
;session.save_path="tcp://localhost:11211?*******"
#こんな感じになる。,以降にもう一台のサーバのアドレスを指定する
session.save_path="tcp://localhost:11211"
Apacheを起動
memcachedを起動
動作確認用のスクリプトを作成
<?php
session_start();
echo @++$_SESSION["counter"]."<br>";
echo $_SERVER['SERVER_ADDR'];
ブラウザからアクセスし、カウントアップすることを確認
memcachedを停止
ブラウザからアクセスし、カウントアップしないことを確認
全てOKなら、同様にしてもう一台もセットアップする。
4.ロードバランサの設定
Load Balancersで、Create Load Balancerから、ロードバランサを作成する。ロードバランサ名は英語で指定する。ADD EC2 Instanceで、先ほどセットアップした2台のインスタンスを指定する。
5.memcachedの接続先を指定
/etc/php.d/memcache.iniを書き換え
変更前
session.save_path=”tcp://localhost:11211″
変更後(カンマ区切りで自分以外のサーバを指定する)
session.save_path=”tcp://localhost:11211,tcp://111.222.111.222″
6.動作確認
ロードバランサのDNS Nameに表示されているアドレス(例:testing-1212930340.ap-northeast-1.elb.amazonaws.com)にWebブラウザでアクセスし、数字が正常にカウントアップされることを確認する。
サーバを交互に停止させても、数字のカウントアップが継続することを確認する。
注意:サーバ停止を検知するまで、デフォルトの設定では最大30秒かかります。ロードバランサのHealth CheckのIntervalを短くすることで切り替えの時間を短縮できます。
7.注意
リソースを確保しっぱなしだと、継続的に費用が発生するので注意!
- 不要になったインスタンスは必ず削除すること。
- 不要になったロードバランサは必ず削除すること。