ホームページ  >  記事  >  バックエンド開発  >  nginxロードバランシングのセッション共有の問題を解決する

nginxロードバランシングのセッション共有の問題を解決する

WBOY
WBOYオリジナル
2016-07-29 09:15:43848ブラウズ

nginx セッションの共有を実現するために、いくつかの情報を確認し、他の人が書いたドキュメントを読みました。要約は次のとおりです。

複数の PHP サーバーがあり、負荷分散に nginx が使用されているため、同じ IP が同じものにアクセスします。サーバー上でセッションが同期されていない場合、最も一般的なログイン ステータスなどの多くの問題が発生します。セッション共有の問題を解決する方法は次のとおりです。

1.代わりに Cookie を使用します

セッション これはサーバー側に保存され、Cookie はクライアント側に保存されます。ユーザーのページへのアクセスによって生成されたセッションを Cookie に入れることができます。つまり、Cookie を乗り換え駅。 Web サーバー A にアクセスし、セッションを生成し、それをサーバー B に割り当てると、サーバー B はまずサーバーにセッションがあるかどうかを判断し、存在しない場合はクライアントの Cookie を確認します。このようなセッションは、実際にはセッションが存在しないことを意味します。Cookie 内にセッションが存在する場合は、Cookie 内のセッションをサーバー B に同期して、セッションを同期できるようにします。

注: この方法は実装が簡単で便利であり、データベースへの負担は増加しません。ただし、クライアントが Cookie を無効にすると、セッションが同期されなくなり、Web サイトのセキュリティが失われます。暗号化されていますが、それでも偽造可能です。

2. セッションをデータベースに保存する (MySQL など)

MySQL の場合、セッションを保存するテーブルをデータベースに保存する方法です。各 mysql ノードにはこのテーブルが必要であり、このセッション テーブルのデータ テーブルはリアルタイムで同期されている必要があります。

注: データベースを使用してセッションを同期すると、データベースの IO が増加し、データベースの負荷が増加します。さらに、データベースの読み取りおよび書き込み速度が遅いため、セッションをタイムリーに同期できません。

3. セッションは memcache または redis に保存されます

memcache は、php 設定ファイルで保存方法が memcache に設定されているため、php 自体がセッション クラスターを確立し、セッション データを memcache に保存します。

注: この方法でセッションを同期すると、データベースの負荷が増加することはなく、Cookie を使用する場合と比較してセキュリティが大幅に向上します。セッションをメモリに保存する方が、ファイルから読み取るよりもはるかに高速です。ただし、me​​mcache はメモリをさまざまな仕様のストレージ ブロックに分割します。この方法では、memcache がメモリを完全に利用できないことが判断され、メモリ ブロックが不足するとメモリ オーバーフローが発生します。

4. nginx の ip_hash テクノロジーは、特定の IP のリクエストを同じバックエンドに送信できるため、この IP の下で特定のクライアントと特定のバックエンドが安定したセッションを確立できます。

    ストリームnginx.example.com {
  1. サーバー192.168.74.236:80;
  2. }
  3. サーバー
  4. {
  5. 80 を聞く;
  6. location /
  7. proxy_pass
  8. http://nginx.example.com ;
  9. .nginx はフロントではありません。エンドサーバー。 ip_hash では、nginx がフロントエンド サーバーである必要があります。そうでない場合、nginx は正しい IP を取得できず、IP に基づいてハッシュできません。たとえば、Squid がフロントエンドとして使用されている場合、nginx は IP を取得するときに Squid のサーバー IP アドレスしか取得できません。このアドレスを配布に使用するのは間違いなく混乱を招きます。
  10. 2. nginx のバックエンドには他の負荷分散方法もあります。
  11. nginx バックエンドに他のロード バランシングがあり、リクエストが他の方法で転送される場合、特定のクライアントからのリクエストは同じセッション アプリケーション サーバー上に存在しません。このように計算すると、nginx バックエンドはアプリケーション サーバーを直接指すか、Squid を構築してからアプリケーション サーバーを指すことしかできません。最善の方法は、位置情報を迂回として使用し、ip_hash を介したセッションを必要とする一部のリクエストを迂回し、残りは他のバックエンドに移動することです。

    5.upstream_hash
    ip_hash のいくつかの問題を解決するために、このモジュールはほとんどの場合 url_hash として使用されますが、セッション共有での使用を妨げるものではありません。試したことがないのでよくわかりません

    補足: memcached の簡単な紹介

    1. コンセプト

    Memcached は、danga.com (を運営する技術チーム) によって開発された分散メモリ オブジェクト キャッシング システムです。 LiveJournal) を使用し、動的システムで使用されます。 データベースの負荷を軽減し、パフォーマンスを向上させます。

    2. 適用される機会

    1. memcached 自体は分散システムに基づいているため、大規模な分散システムに特に適しています。

    2. データベースのフロントエンド キャッシュ。多くの場合、データベースは Web サイト システムのボトルネックになります。データベースへの大量の同時アクセスにより、Web サイトのメモリがオーバーフローすることがよくあります。もちろん、Hibernate のキャッシュ メカニズムを使用することもできます。ただし、me​​mcached は分散に基づいており、Web サイトのアプリケーション自体から独立させることができるため、大規模な Web サイトがアプリケーションを分割するのにより適しています。

    3. サーバー間のデータ共有。たとえば、Web サイトのログイン システムとクエリ システムを 2 つのアプリケーションに分割し、それらを異なるサーバーに配置してクラスタ化します。次に、ユーザーがログインした後、ログイン情報がログイン システム サーバーからクエリ システムにどのように同期されるかを考えます。サーバー?このとき、ログイン システムはログイン情報をキャッシュし、クエリ システムはローカル情報を取得するのと同じようにログイン情報を取得できます。

    3. 適用されない場合

    逆に、「分散」する必要がない、共有する必要がない、または単純にサーバーが 1 つしかないほど小さいアプリケーションの場合、memcached は何のメリットももたらしません。ネットワーク接続にもリソースが必要なため、システムの効率が低下します

    解決策は、memcached をセッション ストレージとして使用し、memcached サーバーを nginx と同じ Linux ホスト上にセットアップすることです。

    解決プロセス、

    2 つの Apache のホスト IP は 192.168.74.235192.168.74.236 です

    Nginx ホスト IP は 192.168.74.131 です

    Memcached ホストの IP は 192.168.74.1 です31

    192.168 に memcached をインストールします.74.131、そして起動

    192.168.74.236を例として、phpとphpの依存関係ライブラリをmemcachedにインストールしますyuminstall memcached-devel.i686 libmemcached-devel.i686 php-pecl-memcache.i686

    php.iniを設定します

    session.save_handler= memcache

    session.save_path= "tcp://192.168.74.131:11211"

    または (次の 2 つは試していません)

    1. 特定のディレクトリの .htaccess:

    php_value session。 save_handler "memcache "
    php_value session.save_path "tcp://IP:11211"

    2. 特定のアプリケーション:

    ini_set("session.save_handler", "memcache");
    ini_set("session.save_path") , "tcp://IP:11211");

    同時に次を必ずコメントアウトしてください;session.save_path= "/var/lib/php/session"

    同時に拡張機能を開きます=memcache.so

    Apacheを再起動し、phpinfoの「登録された保存ハンドラー」を確認します。利用可能な「ファイルusermemcache」がある場合、

    Memcachedサーバーの実行と結果

    がインストールされていることがわかります。 @Git ~]# memcached-tool127.0.0 .1:11211

    # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM

    236 マシンに次の PHP ファイルを追加します

    session_start();

    if (!isset($_SESSION[' TEST'])) {

    $_SESSION['TEST'] = time();

    }

    $_SESSION['TEST3'] = time();

    print $_SESSION['TEST'];

    print "

    ";

    print $_SESSION['TEST3'];

    print "

    ";

    print session_id();

    ?>

    次に、memcached サーバーに移動して

    [root@Git ~]# memcached-tool127.0.0.1:11211

    # Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM

    1 80B 0s 1 0 0 no 0 0 0

    これにより、セッションを memcached サーバーに書き込むこともできるようになります。

    要約すると:

    1. ファイアウォールの問題、LAN サーバーへの接続の失敗の多くはファイアウォールが原因です

    2. 依存関係がインストールされておらず、php-memcached のような拡張ライブラリをインストールしていないため、memcached は常に最初に失敗します

    以上、nginxロードバランシングのセッション共有問題の解決方法を内容も含めて紹介しましたが、PHPチュートリアルに興味のある友人の参考になれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。