Redis + Tomcat + Nginx 集群實現 Session 共享
- 2019 年 11 月 11 日
- 筆記

鏈接: www.cnblogs.com/fanshuyao
一、Session共享使用tomcat-cluster-redis-session-manager插件實現
插件地址見: https://github.com/ran-jit/tomcat-cluster-redis-session-manager
該插件支援Tomcat7、Tomcat8、Tomcat9
或者直接在附件中下載(版本為2.0.2,2017-11-27日前最新版本)
http://dl.iteye.com/topics/download/d9fffd9d-84dd-385b-b10e-6376eaf0c815
這裡有是一個只支援Tomcat7的,不支援tomcat8,暫時不見新的維護:
https://github.com/jcoleman/tomcat-redis-session-manager
二、tomcat-cluster-redis-session-manager詳解
1、解壓後的文件如下:

conf目錄下有一個redis-data-cache.properties :
Redis的配置文件
#-- Redis data-cache configuration #- redis hosts ex: 127.0.0.1:6379, 127.0.0.2:6379, 127.0.0.2:6380, .... redis.hosts=127.0.0.1:6379 #- redis password (for stand-alone mode) #redis.password= #- set true to enable redis cluster mode redis.cluster.enabled=false #- redis database (default 0) #redis.database=0 #- redis connection timeout (default 2000) #redis.timeout=2000
ib目錄下有4個jar包,如下:
1. commons-logging-1.2.jar
2. commons-pool2-2.4.2.jar
3. jedis-2.9.0.jar
4. tomcat-cluster-redis-session-manager-2.0.1.jar
三、使用方法:
壓縮文件中有使用方法,見readMe.txt 文件:
第一步:
1. Move the downloaded jars to tomcat/lib directory * tomcat/lib/
就是把lib目錄下的Jar包全複製到tomcat/lib目錄下
(一般來說tomcat是集群,至少有2個tomcat,所以先配置好一個tomcat,複製完文件後,再將tomcat文件重新複製一份,這樣省事,但需要修改tomcat相應的埠)
第二步:
2. Add tomcat system property "catalina.base" * catalina.base="TOMCAT_LOCATION"
就是配置一個環境變數,和Jdk配置的環境變數一樣,需要配置一個catalina.base的環境變數,值為TOMCAT_LOCATION
如下:


第三步:
3. Extract downloaded package (tomcat-cluster-redis-session-manager.zip) to configure Redis credentials in redis-data-cache.properties file and move the file to tomcat/conf directory * tomcat/conf/redis-data-cache.properties
把conf目錄下的配置文件redis-data-cache.properties複製到tomcat/conf/目錄下
第四步:
4. Add the below two lines in tomcat/conf/context.xml <Valve className="tomcat.request.session.redis.SessionHandlerValve" /> <Manager className="tomcat.request.session.redis.SessionManager" />
在tomcat/conf/目錄下的context.xml文件,加上相應的配置,如下:
<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --><!-- The contents of this file will be loaded for each web application --><Context> <!-- Default set of monitored resources. If one of these changes, the --> <!-- web application will be reloaded. --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource> <!-- Uncomment this to disable session persistence across Tomcat restarts --> <!-- <Manager pathname="" /> --> <!-- Uncomment this to enable Comet connection tacking (provides events on session expiration as well as webapp lifecycle) --> <!-- <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> --> <Valve className="tomcat.request.session.redis.SessionHandlerValve"/> <Manager className="tomcat.request.session.redis.SessionManager"/> </Context>
第五步:
5. Verify the session expiration time (minutes) in tomcat/conf/web.xml <session-config> <session-timeout>60<session-timeout> <session-config>
修改session的過期時間,默認是30分鐘,可以不需要此步驟。
session集群的配置至此結束。
四、Nginx集群
1、下載Nignx:
http://nginx.org/en/download.html
本人練習時使用windows,所以下載的windows版本:
http://nginx.org/download/nginx-1.13.7.zip
2、下載後解壓:D:softnginx-1.12.2
(之前使用的是1.12.2的版本,現在最新版是1.13.7,但都一樣,附件中有1.12.2版本提供下載)

3、修改Nginx配置文件nginx.conf
進入conf目錄(D:softnginx-1.12.2conf),找到nginx.conf配置文件,打開編輯:
3.1在http{……}里加上upstream,如下:
upstream myTomcatCluster{# tomcatCluster和proxy_pass保持一樣 #解決session的問題 #ip_hash;#加上這個,解決Session每次訪問頁面都不一樣,加上就一樣了。 #這裡是tomcat的地址,weight越大,訪問機率越大。 server 127.0.0.1:9300 weight=1 fail_timeout=5s max_fails=1; server 127.0.0.1:9400 weight=1 fail_timeout=5s max_fails=1; }
server:配置tomcat伺服器請求的地址,2台Tomcat服務就配置2個server,分別對應9300,9400埠
weight 表示權重,權重越大,訪問到的機率越大。
3.2、修改location / {……}
默認是這個的:
location / { root html; index index.html index.htm; }
修改成這樣:
location / { #root html; proxy_pass http://myTomcatCluster; #index index.html index.htm; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 1; proxy_read_timeout 1; proxy_send_timeout 1; }
最簡單的配置就是:
location / { proxy_pass http://myTomcatCluster; }
myTomcatCluster 對應upstream後的命名。
下面的配置可以解決2個Tomcat伺服器集群,當一台伺服器掛掉(宕機)後,請求變得很慢的問題。
(Tomcat集群一台伺服器掛掉後請求變慢解決方案)
proxy_connect_timeout 1; proxy_read_timeout 1; proxy_send_timeout 1;
3.3、啟動Nginx伺服器
使用Windows命令行啟動
(1)進入D盤:d:
(2)進入D:softnginx-1.12.2目錄:
cd D:softnginx-1.12.2
(3)啟動服務:(啟動一閃而過,但打開進程管理器能看到是已經啟動的)
start nginx
關閉服務的命令:nginx -s stop
重新載入的命令:nginx -s reload,修改配置文件後,可以使用該命令直接載入,不需要重啟。
五、測試集群:
1、tomcat準備
將已經配置好的一個tomcat複製一份,修改埠,然後再修改一下tomcat的配置文件(server.xml)
我的一個tomcat在:
D:softapache-tomcat-8.0.45-9300conf
另一個是:
D:softapache-tomcat-8.0.45-9400conf
修改:
<Engine defaultHost="localhost" name="Catalina">
其中tomcat 9300埠的修改如下:
<Engine defaultHost="localhost" jvmRoute="jvm9300" name="Catalina">
tomcat 9400埠的修改如下:
<Engine defaultHost="localhost" jvmRoute="jvm9400" name="Catalina">
2、項目準備:
新建立一個web項目,然後新建立一個index.jsp的文件,如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>首頁redis-session</title> </head> <body> <div>tomcat 集群測試</div> <div> <% //HttpSession session = request.getSession(true); System.out.println(session.getId()); out.println("<br> SESSION ID:" + session.getId()+"<br>"); %> </div> </body> </html>
主要是在列印頁面輸出sessionId的資訊:
out.println("<br> SESSION ID:" + session.getId()+"<br>");
然後把這個項目分別部署到9300、9400埠的2個tomcat中,分別啟動,記得也啟動Nginx和redis哦
然後打開瀏覽器通過地址訪問項目:http://localhost/redis-session/ (使用Nginx集群分發,不需要埠號訪問),顯示如下:
tomcat 集群測試 SESSION ID:B837ECA85B47081EAA2FEFCD7E579CD2.jvm9400
無論怎麼刷新訪問(打開新的標籤頁也是(非新窗口))的都是jvm9400,也就是埠號為9400的tomcat
後綴.jvm9400就是前面配置的:
<Engine defaultHost="localhost" jvmRoute="jvm9400" name="Catalina">
打開新的隱身窗口訪問:
tomcat 集群測試 SESSION ID:83BBA58F4EB7B2EFF90AE05D4A0629FD.jvm9300
這時訪問的是埠號為9300的tomcat,通過後綴.jvm9300判斷知道。
新窗口每次訪問的是都是tomcat9300,session也不會變。
在訪問後綴為.jvm9400時,把埠9400的tomcat關掉,再次刷新訪問,sessionId一樣不變,由此可見,2個tomcat的sessionId是共享的。
使用Redis實現session共享的好處就是,把session管理放在redis中,如果伺服器重啟或掛機,sessionId保存在redis中,下次重啟後一樣生效,避免sessionId失效,同樣redis最好也做集群,避免redis重啟或掛機。
– End –