【實戰】Redis + Tomcat + Nginx 集羣實現 Session 共享

點擊上方 Java後端選擇 設爲星標

回覆面試,獲取乾貨


作者 | 蕃薯耀

鏈接 | 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集羣的配置至此結束。

對了,更多實戰教程可以關注微信公衆號 Java後端 ,回覆 666 下載。

四、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版本提供下載)

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

進入conf目錄(D:\soft\nginx-1.12.2\conf),找到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:\soft\nginx-1.12.2目錄:

cd D:\soft\nginx-1.12.2

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

start nginx

關閉服務的命令: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

修改:

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

如果看到這裏,說明你喜歡這篇文章,請轉發、點贊。同時標星(置頂)本公衆號可以第一時間接受到博文推送。

推薦閱讀

阿里職級體系與薪酬全曝光,P10以上都是世界大牛!

90秒100億的背後,阿里巴巴到底做了什麼?

Spring Boot系列文章彙總,值得收藏

目前10000+ 人已關注加入我們

       

        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章