• ベストアンサー

複数のサーバで運営する場合のセッション管理

IPの違う複数のWEBサーバで、1つのホームページを 運営するとき、サーバ間を移動してもログイン状態 を保つためには、どのようにすれば良いでしょうか? IPベースのバーチャルホストで、ログインサーバと 他の部分を分けるなどしたいのですが・・・。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

実装法方法はいろいろ考えられると思いますが、私なら、と言う事で。 最終的にログインサーバを作る、と言う事ですので、セッションが開始されていない場合はどのサーバからもリダイレクトでログインサーバに飛ばすようにして、ログイン時に全てのサーバへセッション登録してしまえば良いと思います。 <?php //ファイルヘッダー部分、セッション登録されていない場合はログインへ session_start(); if($_SESSION[THIS_LOGIN] != "ON") header("Location: http://login.server.com/login.php"); ?> 当然、セッション登録時には全てのサーバに登録する必要があると思います。 リダイレクトでセッション登録しながら一回りするとか、curl関数等を使って不可視で変数を渡すとか言う方法が考えられます。 DBは共通と言う事なので、セッションIDだけ <?php //curl関数でセッション登録してしまう場合 if(LOGIN IS TRUE){ //一つ目のサーバ $sev1 = curl_init ("http://server1.com/sessin.php?id=".$sessid); curl_exec ($sev1); curl_close ($sev1); //同様に $sev2 = curl_init ("http://server2.com/sessin.php?id=".$sessid); curl_exec ($sev2); curl_close ($sev2); $sev3 = curl_init ("http://server3.com/sessin.php?id=".$sessid); curl_exec ($sev3); curl_close ($sev3); } ?> こんな感じでログイン時のセッションIDを飛ばしておいて、それぞれのサーバでセッション登録すれば良いと思います。 実験してませんが、可能かと。

orenge_mint
質問者

お礼

返信遅くなりました。 確かに、各サーバにセッションを飛ばせば、ログイン状態が維持できますね。 (ふと、各サーバの /tmp に保存されるセッションファイルを参照する際、 常にログインサーバの /tmp を読みに行くように設定すれば セッションファイルを分散しなくていいのでは、なども思いつきましたが・・・) とても参考になりました。ありがとうございました。

その他の回答 (4)

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.5

>私が実現したいことは、物理的にWebサーバを複数用意し、クライアントはWebサーバ間を自由に移動できるけど、セッションは維持したいということです。 似たような要件にSSO(Single Sign On)があります。SSOの仕組みについては何種類かあるので検索してみるといいでしょう。今回の要件に合うような仕組みのものが見つかると思います。

orenge_mint
質問者

お礼

ありがとうございました。 参考にしてみます。

  • you-m
  • ベストアンサー率58% (190/327)
回答No.3

ん~、まだ全然具体的とはいいがたいですね。 セッション情報を管理するっていうのは、まずポイントとして2つあります。 一つは、クライアント側にセッション情報をどう持たせるか。 もう一つが、サーバサイドのセッション情報保持です。 Webサーバ間を移動するってことは、クライアントから見て違う名前のホストにアクセスするってことですよね。となると、セッション情報をクッキーを使って保持するのは不可能なので、セッションIDを必ずURLに混ぜるとか、常にフォームを使った移動やアクションにしておき、POSTでセッションIDをもらうかという感じになります。後者はコンテンツ自体に制約が大きくなるというか、単なるリンクで済むものが、そうでなくなるのでいまいちですね。 で、適切な方法も何もこれでは、ぢゃあDBにセッション情報書きましょう、以上で終わってしまいますね。 ただ、言えることは、方法論としては言語によって適用できるとかできないとかの話ではないので、それがCGIベースの話であろうが、Javaサーブレットの話であろうが、大した問題ではありませんね。 Webアプリケーションサーバを使う場合には、逆にセッション情報をDBへ書き込む仕様のものは無かった(私もあまり製品の情報には詳しくないし)少なくとも私のわかる範囲の製品には、バックエンドのDBを使ってセッション情報を扱っていたものは無かったですね。 実装としては、さほど複雑にはならないと思います。 リクエストを受け付けた最初の処理で、必ず 1.クライアントからのセッションIDの取得 2.セッションIDが有効か否かの確認。 3.有効だったら、セッションに紐つくトークン(ログイン済みのユーザを表す情報の塊)を取得する。 逆にログイン時には、セッションIDと共に、トークンを生成することになります。 DBを使う場合には、セッションIDをキー項目にしたテーブルに、レコードを追加して、その内容がトークンということになるでしょうか。 トークンには、最低限の項目として、セッションID、ユーザ名、セッションの有効期限が必要でしょう。もちろん必要であれば、その他にも様々な情報を付与することも可能です。 トークンを取得する際には、有効期限を確認し、期限切れの場合には、エラーを返して、トークンを削除します。 また、ログアウト時にも、当然トークンは削除しますが、ログアウトという操作を必ず行ってくれるとは限らないので、期限切れのトークンをスイープするバッチ処理を定期的に走らせます。大抵はCRON等のスケジューラを使いますかね。 有効期限は、一般的には何かアクションを起こすたびに更新されますね。 トークンは、必ず毎回取得する情報になるので、あまり情報量をふやしすぎないのが得策でしょう。 その辺りはシステムとしてのバランスの問題ですが。 ここであげた事は基本的な手法の話ですから、実際に実装する際には環境や形態、あるいは用途により、いろいろ考えないといけない処もまだまだあります。 まあ、こんな感じで参考になりますかね。

orenge_mint
質問者

お礼

返信遅くなりまして、すみません。 実は私はプログラマではなく、プログラマを雇う側の 人間なので、まだまだ勉強な点がありますが、 非常に参考になりました。ありがとうございました。

  • you-m
  • ベストアンサー率58% (190/327)
回答No.2

いまいち、質問者さんが考えている実現環境が明確でないのですが、要はWebサーバは物理的にいくつかあって、クライアントがどこのWebサーバにくるか正確にわからないという前提で、セッションを管理する方法があるかということであれば、方法はあると言う回答になるでしょう。 ANo.1にて出ているものもそうです。 そもそも、ホームページの運営という言葉とはかなりイメージが違うんですが、Webベースのシステムで、ログイン中のユーザをWebサーバが変わっても正しく認識できるようにしたいという話であれば、まずはセッション情報をどう扱うかという話になります。 ここでセッション情報の共有には2つのアプローチがあり、全Webサーバが共有して見れる場所に置くか、セッション情報自体を、レプリケーションして同じ物をみんなで共有するかです。これは設計にも関わることですが、いわゆるWebアプリケーションサーバと呼ばれるものは、この情報をレプリケーションする機能を持ったものが多いです。つまり後者のアプローチですね。 前者のアプローチの場合、大規模に使われるならデータベースにセッション情報を格納するか、セッション管理専用のサーバに任せる等の方法があります。セッション管理サーバを使う場合には、ここを二重化する際には、結局情報をレプリケーションする必要がありますけどね。 もっとお手軽に実現する場合には、各Webサーバが共有のNFSサーバを見れるようにしておき、そこにファイルベースでセッションを格納する方法もあります。 ただ、利用者数が多いとパフォーマンス的に問題も出やすいし、何よりNFS自体やることは単純な割に比較的運用が難しい機能である為、実現方法としてはお手軽でも、ちょっと微妙です。 質問者さんが、もう少し実現したいことをきちんと明確に説明してくれれば、他にも有用な回答があるかもしれませんが、今のままだと、この程度の一般論になりますね。

orenge_mint
質問者

お礼

ありがとうございます。 私が実現したいことは、物理的にWebサーバを複数用意し、 クライアントはWebサーバ間を自由に移動できるけど、 セッションは維持したいということです。 最初はWebサーバ1台とDBサーバ1台で運用するのですが、 バーチャルホストで、loginサーバやinfoサーバなどを用意しておき、 後々それを物理サーバに移行したいと考えています。 どのWebサーバからもDBサーバにアクセスできるので、 DBにセッション情報を書き込むタイプがいいかなと思いました。 もし上記のような要件で、適切なセッション管理方法が あればご教授ください。よろしくお願い致します。

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

複数のサーバで同一のセションを利用したいときは、セションのレプリケーション機能を持っているサーバを利用するか、セションに対応したロードバランサを利用します。

orenge_mint
質問者

お礼

ありがとうございます。 参考になりました。

関連するQ&A