Nginx+Tomcat のセッション管理について

不言
リリース: 2023-04-02 20:28:02
オリジナル
1314 人が閲覧しました

この記事では、主に Nginx Tomcat のセッション管理について紹介しますが、これは参考になると思いますので、皆さんにも共有します。必要な友人は参考にしてください。

まえがき

Nginx Tomcat は常にセッションの管理を理解していましたが、実践したことはありませんでした。この記事では、最も簡単なインストールと起動から始まり、例を通してセッションを管理するいくつかの方法を徐々に紹介します。

nginx インストール構成

1. nginx をインストールします

[root@localhost ~]# yum install nginx
ログイン後にコピー

プロンプトで次のエラーが報告されます:

No package nginx available.
ログイン後にコピー

epel をインストールする解決策: EPEL EPEL は、Enterprise Linux Add-on Package の略称です。EPEL は、Red Hat Enterprise Linux (RHEL) およびその派生ディストリビューション (CentOS、Scientific Linux、Oracle Enterprise Linux など) に対して、Fedora Special Interest Group によって作成、保守、および管理されます。 ) 高品質の追加ソフトウェア パッケージ プロジェクト;

[root@localhost ~]# yum install epel-release
ログイン後にコピー

インストール後、nginx を正常にインストールできます;

2. nginx の起動と停止

最初に nginx のディレクトリに入ります

[root@localhost nginx]# cd /usr/sbin/
ログイン後にコピー

コマンドを実行

./nginx 开启
./nginx -s stop  使用kill命令强制杀掉进程
./nginx -s quit  待nginx进程处理任务完毕进行停止
./nginx -s reload
ログイン後にコピー

nginx tomcatロードバランシング

1. 2つのtomcatを用意し、それぞれポート8081と8082を指定します

drwxr-xr-x. 9 root root      4096 May  7 14:16 apache-tomcat-7.0.88_8081
drwxr-xr-x. 9 root root      4096 May  7 14:16 apache-tomcat-7.0.88_8082
ログイン後にコピー

テストを容易にするために webapps/ROOT のindex.jsp を変更します

<%
if(request.getSession().getAttribute("key")==null){
   out.println("key is null,ready init.....");   
   request.getSession().setAttribute("key","value");
}else{
   out.println("key is not null,key="+request.getSession().getAttribute("key"));  
}
%>
<br> 
sessionID:<%=session.getId()%>   
<br>   
sessionCreateTime:<%= session.getCreationTime() %>
<br>
<% 
out.println("tomcat port 8081");   
%>
ログイン後にコピー

最終出力では、2 つの tomcats

2.nginx 構成ロード バランシングの下で​​それぞれのポート番号 8081 と 8082 を指定します (デフォルトの戦略) )

/etc/nginx/

upstream tomcatTest {
     server 127.0.0.1:8081;   #tomcat-8081
     server 127.0.0.1:8082;   #tomcat-8082
}
 
server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;
    root         /usr/share/nginx/html;
 
    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;
 
    location / {
        proxy_pass http://tomcatTest;
    }
 
    error_page 404 /404.html;
        location = /40x.html {
    }
 
    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}
ログイン後にコピー
の nginx.conf を変更します。

ここで設定された負荷分散戦略は、デフォルトのポーリング戦略です。nginx は、ip_hash、weight、fair (3 番目) などの他の戦略もサポートしています。 party), url_hash (サードパーティ);
デフォルト ポリシー 各 Web リクエストは、時系列順に異なるバックエンド サーバーに 1 つずつ割り当てられます。この場合、リクエストごとに新しいセッションが作成されます。次の単純な操作を実行します。テスト:
最初のリクエスト http://ip/

key is null,ready init..... 
sessionID:E7A9782DED29FF04E21DF94078CB4F62 
sessionCreateTime:1527732911441
tomcat port 8082
ログイン後にコピー

2 回目の更新 http://ip/

key is null,ready init..... 
sessionID:7812E8E21DBB74CC7FBB75A0DFF2E9CB 
sessionCreateTime:1527732979810
tomcat port 8081
ログイン後にコピー

3 回目の更新 http://ip/

key is null,ready init..... 
sessionID:8895F41E299785A21995D5F8BB734B86 
sessionCreateTime:1527733011878
tomcat port 8082
ログイン後にコピー

毎回新しいセッションが生成され、メッセージが時系列に 1 つずつ異なるバックエンド サーバーに配信されていることがわかりますが、通常、セッションを維持する必要がある Web サイトでは、リクエストごとにセッションを生成することはできません。 ;

3.nginx 設定の負荷分散 (スティッキー セッション)

各リクエストはアクセス IP のハッシュ結果に従って割り当てられるため、各訪問者はバックエンドへの固定アクセス権を持ちます。セッションの問題を解決できるサーバー 質問; nginx はアップストリーム モジュールで ip_hash を設定することでスティッキー セッションを実現できます;

upstream tomcatTest {
     ip_hash;
     server 127.0.0.1:8081;   #tomcat-8081
     server 127.0.0.1:8082;   #tomcat-8082
}
ログイン後にコピー

以下の簡単なテストを行ってください:
最初のリクエストは http://ip/

key is null,ready init..... 
sessionID:859BADFB09A4ECEAEC5257F518C228A0 
sessionCreateTime:1527734181450
tomcat port 8081
ログイン後にコピー

2 回目 http://ip/

key is not null,key=value 
sessionID:859BADFB09A4ECEAEC5257F518C228A0 
sessionCreateTime:1527734181450
tomcat port 8081
ログイン後にコピー
ログイン後にコピー

を 3 回更新し、http://ip/

key is not null,key=value 
sessionID:859BADFB09A4ECEAEC5257F518C228A0 
sessionCreateTime:1527734181450
tomcat port 8081
ログイン後にコピー
ログイン後にコピー

を 3 回更新します。その key=value は最初のリクエストで設定され、それ以降は毎回取得できます。key 値に対して、sessionId は変更されておらず、Tomcat も変更されていないため、スティッキー セッションが実現されます。ポート = 8081 で Tomcat を停止し、
http://ip/

key is null,ready init..... 
sessionID:3C15FE2C8E8A9DCDC6EAD48180B78B80 
sessionCreateTime:1527735994476
tomcat port 8082
ログイン後にコピー
の 4 回目の更新 http://ip/

key is not null,key=value 
sessionID:3C15FE2C8E8A9DCDC6EAD48180B78B80 
sessionCreateTime:1527735994476
tomcat port 8082
ログイン後にコピー
を観察します。メッセージが tomcat-8082 に転送され、セッションが失われ、新しいセッションが再作成されることがわかります;

これを行う方法 この場合、セッションは失われず、解決策は 2 つあります。セッション レプリケーションとセッション共有。スケーラビリティとパフォーマンスの点でセッション共有の方が優れています。以下では、セッション共有の実装方法に焦点を当てます。

nginx tomcat の実装セッション共有

セッション共有の考え方は、セッションをパブリックな場所に保存し、使用時に取り出すことです。特定のパブリックな場所には、次のように redis、db、memcached などが考えられます。redis はインスタンスです

1.redis インストール構成

yum install redis
ログイン後にコピー

インストールが完了したら、ファイル /etc/redis.conf を構成します

redis サーバーを起動します

redis-server /etc/redis.conf
ログイン後にコピー
クライアントを起動します

redis-cli
ログイン後にコピー
2.Tomcat は依存する jar

$TOMCAT_HOME/lib を導入し、次の jar パッケージを追加します

<dependency>
    <groupId>com.bluejeans</groupId>
    <artifactId>tomcat-redis-session-manager</artifactId>
    <version>2.0.0</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.5.2</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.2</version>
</dependency>
ログイン後にコピー
3.Tomcat は構成を変更します

$TOMCAT_HOME/conf を変更しますディレクトリ

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
         host="localhost"
         port="6379"
         database="0"
         maxInactiveInterval="60"/>
ログイン後にコピー
内の context.xml ファイルは、オープンなセッション管理と永続性 org.apache.catalina.session.ManagerBase を提供します。この抽象クラスを継承し、いくつかの簡単な設定を行うことで、セッション管理クラスで次のことを行うことができます。ここでは、tomcat-redis-session-manager はセッションの管理に使用されます;

RedisSessionManager は org.apache.catalina.session.ManagerBase クラスから継承し、セッションを担当します。関連する操作は次のとおりです。すべてこのカテゴリに含まれます;

4. テスト

最初のリクエストは http://ip/

key is null,ready init..... 
sessionID:1131499E5A65DE1591152465E7B24B1F 
sessionCreateTime:1527740273682
tomcat port 8081
ログイン後にコピー
2 回目は http://ip/ ## を更新します#
key is not null,key=value 
sessionID:1131499E5A65DE1591152465E7B24B1F 
sessionCreateTime:1527740273682
tomcat port 8081
ログイン後にコピー

tomcat-8081 を停止し、http://ip/

key is not null,key=value 
sessionID:1131499E5A65DE1591152465E7B24B1F 
sessionCreateTime:1527740273682
tomcat port 8082
ログイン後にコピー

を 3 回更新します。メッセージは tomcat-8082 ノードに転送されていますが、セッションは転送されていないことがわかります。同時に、キーは値

5 も取得できます。redis

[root@localhost ~]# redis-cli
127.0.0.1:6379> keys *
1) "1131499E5A65DE1591152465E7B24B1F"
127.0.0.1:6379> get 1131499E5A65DE1591152465E7B24B1F
"\xac\xed\x00\x05sr\x00Dcom.orangefunction.tomcat.redissessions.SessionSerializationMetadataB\xd9\xd9\xf7v\xa2\xdbL\x03\x00\x01[\x00\x15sessionAttributesHasht\x00\x02[Bxpw\x14\x00\x00\x00\x10}\xc8\xc9\xcf\xf6\xc3\xb5Y\xc7\x0c\x8eF\xa5\xfaQ\xe8xsr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01c\xb4j\x94\x12sq\x00~\x00\x03\x00\x00\x01c\xb4j\x94\x12sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexq\x00~\x00\x04\x00\x00\a\bsr\x00\x11java.lang.Boolean\xcd r\x80\xd5\x9c\xfa\xee\x02\x00\x01Z\x00\x05valuexp\x01q\x00~\x00\nsq\x00~\x00\x03\x00\x00\x01c\xb4j\x94*t\x00 1131499E5A65DE1591152465E7B24B1Fsq\x00~\x00\a\x00\x00\x00\x01t\x00\x03keyt\x00\x05valuew\b\x00\x00\x01c\xb4j\x94\x12"
ログイン後にコピー

を確認すると、セッション オブジェクトが redis に保存されており、sessionId がセッションのバイナリ データを保存するためのキー値として使用されます;

上記がこの記事の全内容です。皆様の学習に役立つことを願っています。その他の関連コンテンツについては、 PHPの中国語サイトです!

関連する推奨事項:

nginx はリバース プロキシと負荷分散を実装します

以上がNginx+Tomcat のセッション管理についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート