この記事では、主に Nginx Tomcat のセッション管理について紹介しますが、これは参考になると思いますので、皆さんにも共有します。必要な友人は参考にしてください。
Nginx Tomcat は常にセッションの管理を理解していましたが、実践したことはありませんでした。この記事では、最も簡単なインストールと起動から始まり、例を通してセッションを管理するいくつかの方法を徐々に紹介します。
[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 を正常にインストールできます;
最初に nginx のディレクトリに入ります
[root@localhost nginx]# cd /usr/sbin/
コマンドを実行
./nginx 开启 ./nginx -s stop 使用kill命令强制杀掉进程 ./nginx -s quit 待nginx进程处理任务完毕进行停止 ./nginx -s reload
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
/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 は、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 サイトでは、リクエストごとにセッションを生成することはできません。 ;
各リクエストはアクセス 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
key is not null,key=value sessionID:3C15FE2C8E8A9DCDC6EAD48180B78B80 sessionCreateTime:1527735994476 tomcat port 8082
これを行う方法 この場合、セッションは失われず、解決策は 2 つあります。セッション レプリケーションとセッション共有。スケーラビリティとパフォーマンスの点でセッション共有の方が優れています。以下では、セッション共有の実装方法に焦点を当てます。
yum install redis
redis サーバーを起動します
redis-server /etc/redis.conf
redis-cli
<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>
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="localhost" port="6379" database="0" maxInactiveInterval="60"/>
RedisSessionManager は org.apache.catalina.session.ManagerBase クラスから継承し、セッションを担当します。関連する操作は次のとおりです。すべてこのカテゴリに含まれます;
key is null,ready init..... sessionID:1131499E5A65DE1591152465E7B24B1F sessionCreateTime:1527740273682 tomcat port 8081
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 サイトの他の関連記事を参照してください。