Redis + Tomcat + Nginx 集群實現 Session 共享

Java後端,選擇

優質文章,及時送達

Redis + Tomcat + Nginx 集群实现 Session 共享

作者 | 蕃薯耀

鏈接 | www.cnblogs.com/fanshuyao

上篇 | 35 個小細節,提升 Java 代碼運行效率

一、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、解壓後的文件如下:

Redis + Tomcat + Nginx 集群实现 Session 共享

conf目錄下有一個redis-data-cache.properties :

Redis的配置文件

<code>#-- 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/<code>

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 文件:

第一步:

<code>1. Move the downloaded jars to tomcat/lib directory
* tomcat/lib//<code>

就是把lib目錄下的Jar包全複製到tomcat/lib目錄下

(一般來說tomcat是集群,至少有2個tomcat,所以先配置好一個tomcat,複製完文件後,再將tomcat文件重新複製一份,這樣省事,但需要修改tomcat相應的端口)

第二步:

<code>2. Add tomcat system property "catalina.base" 
* catalina.base="TOMCAT_LOCATION"/<code>

就是配置一個環境變量,和Jdk配置的環境變量一樣,需要配置一個catalina.base的環境變量,值為TOMCAT_LOCATION

如下:

Redis + Tomcat + Nginx 集群实现 Session 共享
Redis + Tomcat + Nginx 集群实现 Session 共享

第三步:

<code>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/<code>

把conf目錄下的配置文件redis-data-cache.properties複製到tomcat/conf/目錄下

第四步:

<code>4. Add the below two lines in tomcat/conf/context.xml
<valve>
<manager>/<code>

在tomcat/conf/目錄下的context.xml文件,加上相應的配置,如下:

<code> 

<context>



<watchedresource>WEB-INF/web.xml/<watchedresource>
<watchedresource>${catalina.base}/conf/web.xml/<watchedresource>






<valve>
<manager>

/<context>/<code>

第五步:

<code>5. Verify the session expiration time (minutes) in tomcat/conf/web.xml
<session-config>
<session-timeout>60<session-timeout>
<session-config>/<session-timeout>/<session-timeout>/<session-config>/<code>

修改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:\\soft\\nginx-1.12.2

(之前使用的是1.12.2的版本,現在最新版是1.13.7,但都一樣,附件中有1.12.2版本提供下載)

Redis + Tomcat + Nginx 集群实现 Session 共享

3、修改Nginx配置文件nginx.conf

進入conf目錄(D:\\soft\\nginx-1.12.2\\conf),找到nginx.conf配置文件,打開編輯:

3.1在http{……}里加上upstream,如下:

<code>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;
}/<code>

server:配置tomcat服務器請求的地址,2臺Tomcat服務就配置2個server,分別對應9300,9400端口

weight 表示權重,權重越大,訪問到的機率越大。

3.2、修改location / {……}

默認是這個的:

<code>location / {
root html;
index index.html index.htm;
}/<code>

修改成這樣:

<code>location / {
#root html;
proxy_pass http://myTomcatCluster;
#index index.html index.htm;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_a
ddr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 1;
proxy_read_timeout 1;
proxy_send_timeout 1;
}/<code>

最簡單的配置就是:

<code>location / {
proxy_pass http://myTomcatCluster;
}/<code>

myTomcatCluster 對應upstream後的命名。

下面的配置可以解決2個Tomcat服務器集群,當一臺服務器掛掉(宕機)後,請求變得很慢的問題。

(Tomcat集群一臺服務器掛掉後請求變慢解決方案)

<code>proxy_connect_timeout 1;
proxy_read_timeout 1;
proxy_send_timeout 1;/<code>

3.3、啟動Nginx服務器

使用Windows命令行啟動

(1)進入D盤:d:

(2)進入D:\\soft\\nginx-1.12.2目錄:

<code>cd D:\\soft\\nginx-1.12.2/<code>

(3)啟動服務:(啟動一閃而過,但打開進程管理器能看到是已經啟動的)

<code>start nginx/<code>

關閉服務的命令:nginx -s stop

重新加載的命令:nginx -s reload,修改配置文件後,可以使用該命令直接加載,不需要重啟。

五、測試集群:

1、tomcat準備

將已經配置好的一個tomcat複製一份,修改端口,然後再修改一下tomcat的配置文件(server.xml)

我的一個tomcat在:

D:\\soft\\apache-tomcat-8.0.45-9300\\conf

另一個是:

D:\\soft\\apache-tomcat-8.0.45-9400\\conf

修改:

<code><engine>/<code>

其中tomcat 9300端口的修改如下:

<code><engine>/<code>

tomcat 9400端口的修改如下:

<code><engine>/<code>

2、項目準備:

新建立一個web項目,然後新建立一個index.jsp的文件,如下:

<code>pageEncoding="UTF-8"%>
hrome-extension-mutihighlight chrome-extension-mutihighlight-style-2">www.w3.org/TR/html4/loose.dtd">



<title>首頁redis-session/<title>


tomcat 集群測試


//HttpSession session = request.getSession(true);
System.out.println(session.getId);
out.println("
SESSION ID:" + session.getId+"
");
%>


/<code>

主要是在打印頁面輸出sessionId的信息:

<code>out.println("
SESSION ID:" + session.getId+"
");/<code>

然後把這個項目分別部署到9300、9400端口的2個tomcat中,分別啟動,記得也啟動Nginx和redis哦

然後打開瀏覽器通過地址訪問項目:http://localhost/redis-session/ (使用Nginx集群分發,不需要端口號訪問),顯示如下:

<code>tomcat 集群測試

SESSION ID:B837ECA85B47081EAA2FEFCD7E579CD2.jvm9400/<code>

無論怎麼刷新訪問(打開新的標籤頁也是(非新窗口))的都是jvm9400,也就是端口號為9400的tomcat

後綴.jvm9400就是前面配置的:

<code><engine>/<code>

打開新的隱身窗口訪問:

<code>tomcat 集群測試

SESSION ID:83BBA58F4EB7B2EFF90AE05D4A0629FD.jvm9300/<code>

這時訪問的是端口號為9300的tomcat,通過後綴.jvm9300判斷知道。

新窗口每次訪問的是都是tomcat9300,session也不會變。

在訪問後綴為.jvm9400時,把端口9400的tomcat關掉,再次刷新訪問,sessionId一樣不變,由此可見,2個tomcat的sessionId是共享的。

使用Redis實現session共享的好處就是,把session管理放在redis中,如果服務器重啟或掛機,sessionId保存在redis中,下次重啟後一樣生效,避免sessionId失效,同樣redis最好也做集群,避免redis重啟或掛機。

-END-

如果看到這裡,說明你喜歡這篇文章,請轉發、點贊。微信搜索「web_resource」,關注後回覆「進群」或者掃描下方二維碼即可進入無廣告交流群。

喜歡文章,點個在看

Redis + Tomcat + Nginx 集群实现 Session 共享


分享到:


相關文章: