大量のアクセスに対応するため、またWebサーバ故障時のリスクを減らすため に、Webサーバを複数台使用する場合があるかと思います。そのような環境で PHPを使用する場合、セッション情報をどう管理するかが問題の一つとして出て きます。

今回はそんな時に使えるセッションサーバ、sharedanceを紹介します。 sharedanceを使うと、複数のWebサーバ間でセッション情報を共有できるよう になります。また、設定が簡単で、動作も比較的軽いのが特徴です。

では、早速インストール、設定方法を順に見ていきます。 (以下の説明ではlinux環境を想定しています。)

1)libeventのインストール

sharedanceではlibeventというライブラリを使用するので、まずこれをインス トールします。 ソースコードを下記ホームページからダウンロードし、適当なディレクトリに展 開します。

libeventのホームページ

http://www.monkey.org/~provos/libevent/

展開してできたディレクトリで

./configure
make

を実行後、rootユーザで

make install

を実行すればインストール完了です。

2)sharedanceのインストール

次に、sharedanceをインストールします。 こちらも、ソースコードを下記ホームページからをダウンロードし、適当なディ レクトリに展開します。

sharedanceのホームページ

http://sharedance.pureftpd.org/project/sharedance

展開してできたディレクトリで

./configure
make

を実行後、rootユーザで

make install-strip

を実行すればインストール完了です。

3)sharedanceの起動

/usr/local/sbin/sharedanced --directory=/var/tmp/sharedance --deamonize

というようなコマンドでsharedanceを起動します。--directoryではsharedance がデータを保存するディレクトリを指定しますが、ここでメモリ上のファイルシ ステムにあるディレクトリを指定すると、速度が格段に速くなります。 このコマンド実行時に指定したディレクトリがないとsharedanceは起動しないの で、先にディレクトリを作っておくようにしましょう。

また、sharedanceは1042番がデフォルトの待ち受けポートになっています。 変更する場合はコマンドに

--port=(ポート番号)

をつけて実行します。

※それでもプログラムが起動しない場合

LD_LIBRARY_PATHの設定がうまくできていない可能性があります。 bashの場合、

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

を実行後、上記のコマンドを実行して下さい。 それでもダメな場合、起動時のオプションに

--ip=(sharedanceサーバのipアドレス)

を追加してコマンドを実行して下さい。

4)PHPの設定

次に、PHPでsharedanceを使用するように設定します。 必要なPHPファイルがsharedanceを展開したディレクトリのphpディレクトリにあ るので、これを適当なディレクトリにコピーして使用します。 ここでは

/opt/sharedance

に必要なファイルをコピーしたとします。 この中のsession_handler.phpで、セッションサーバのIPまたはホスト名を指定 できるようになっています。 SESSION_HANDLER_HOSTの値がデフォルトではlocalhostになっているので、これ を環境に合わせて変更しておきます。

続いて、php.iniで以下の2箇所を変更します。

・auto_prepend_file
auto_prepend_file=/opt/sharedance/session_handler.php
・session.save_handler
session.save_handler = user

あとはapacheを再起動するだけです。

実際にセッションを利用したスクリプトにアクセスしてみましょう。うまく動作 している場合、起動時に指定したディレクトリ内にファイルが作成されているは ずです。

※大量のアクセスに対応するには?

大量のアクセスが予想される場合は、sharedance起動前に下記のようなコマンド を実行します。

/sbin/sysctl -w fs.file-max=65536
ulimit -n 65536
/sbin/sysctl -w net.ipv4.ip_local_port_range="1024 65000"