ロードバランサ配下のPHPセッションをmemcachedで共有する方法

ネットワーク # サーバー運用 # ロードバランサ

こんにちは、UOZUです!

先にエンハンスドロードバランサのセッション維持機能について記事を書きましたが、今回はセッション維持機能の無いロードバランサのPHPセッションをmemcachedで共通化してみようと思います。

PHPセッションの管理サンプル

PHPセッションでは、ブラウザ側のCookieにセッションIDを持たせ、サーバー側に保存されたセッション情報と照合することで、同じ利用者の状態を管理します。

デフォルトではセッション情報は各サーバーのローカルディスクに保存されるため、ロードバランサ配下で接続先サーバーが切り替わると、セッション情報を正しく参照できない場合があります。

サンプルコードを作って試してみます。

「php_uozu」でセッション情報を管理し、すでにブラウザにセッションCookieがある場合、ホスト名の下の数字が増える単純なスクリプトです。

また、ブラウザ上のCookieの情報と、サーバ内のセッション情報は同じ名前で保存され、アクセスの際に突合されるという仕組みになっています。

ロードバランサ利用の際の問題

ロードバランサを利用した際、ロードバランサ自身にセッション維持機能は無く、常に振り分けアルゴリズムはleast connection(変更不可)となる為、アクセス後にどのサーバーにつながるかは保証されておらず、正しくPHPセッションが利用できなくなります。

memcachedとPHPの設定変更

サーバ内のPHPセッションの保存方法(session.save_handler)ですが、デフォルトではfilesとなっているので、サーバのローカルディスクに追記されていきます。

memcachedを導入し、このセッション情報の保存先を変更していきます。

今回は検証のため 0.0.0.0 で待ち受けていますが、待ち受けIPはプライベート側のIPアドレスに限定し、パケットフィルターやOSのファイアウォールでWebサーバー間の通信だけを許可する構成をおすすめします。

また、同様の作業は他のサーバーでも行います。

memcached設定後の動作確認

設定変更後、改めてcurlでロードバランサからPHPセッションの管理サンプルにアクセスをしてみます。

無事、サーバ間でPHPセッションの共通化が出来ました。

memcachedの中にもセッション情報が入っていることが確認できますね。

ただし、memcachedを利用したセッションは、memcachedやサーバが再起動してしまうと消えてしまうため注意が必要です。

さいごに

今回は、ロードバランサ配下でPHPセッションを利用する際の問題と、memcachedを使ってセッション情報を共通化する方法を確認しました。

PHPのデフォルト設定では、セッション情報は各サーバーのローカルディスクに保存されます。そのため、ロードバランサによって接続先サーバーが切り替わると、同じセッションIDを持っていても、別サーバー側ではセッション情報を参照できない場合があります。

session.save_handlermemcached に変更し、複数サーバーから同じセッション保存先を参照できるようにすることで、接続先サーバーが切り替わってもPHPセッションを継続できることを確認できました。

ただし、memcachedに保存したセッション情報は、memcachedやサーバーの再起動で消える可能性があります。また、memcachedを外部から接続できる状態にすると危険なため、待ち受けIPやファイアウォール設定には注意が必要です。

状態セッション保存先ロードバランサ配下での挙動
デフォルト設定各サーバーのローカルディスク接続先サーバーが変わるとセッション情報を共有できない
memcached設定後memcached接続先サーバーが変わってもセッション情報を参照できる
memcached再起動後消失する可能性ありセッションが消えるため注意が必要
永続化したい場合NFSなどの共有ストレージも候補性能・ロック・障害影響を考慮する必要あり

ロードバランサ配下でPHPアプリケーションを動かす場合は、セッション情報をどこに保存するかを事前に設計しておくことをおすすめします。

最後までお読みいただき、ありがとうございます!

この記事を書いた人

UOZU

ネットアシスト運用チーム10年目の運用エンジニア

さくらのクラウド検定 ベーシック (第一回)

さくらのクラウド検定 アドバンスド (第一回)

AWS Certified Solutions Architect - Associate

AWS Certified AI Practitioner