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

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

一、Session共享使用tomcat-cluster-redis-session-manager插件实现

插件地址见:
https://github.com/ran-jit/tomcat-cluster-redis-session-manager

该插件支持Tomcat7、Tomcat8、Tomcat9

二、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包,如下:

commons-logging-1.2.jar

commons-pool2-2.4.2.jar

jedis-2.9.0.jar

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 的实际地址

第三步:

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文件,加上相应的配置,如下:

<Context>  

      
      
    <WatchedResource>WEB-INF/web.xmlWatchedResource>  
    <WatchedResource>${catalina.base}/conf/web.xmlWatchedResource>  

      
      

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

修改:

其中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'%>  
  
<html>  
<head>  
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>  
<title>首页redis-sessiontitle>  
head>  
<body>  
    <div>tomcat 集群测试div>  
    <div>  
        <%     
          //HttpSession session = request.getSession(true);     
          System.out.println(session.getId());     
          out.println('
 SESSION ID:' + session.getId()+'
');     
        %>  
    div>  
body>  
html>  

主要是在打印页面输出sessionId的信息:

out.println('
 SESSION ID:' + session.getId()+'
');  
 

然后把这个项目分别部署到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重启或挂机。

结束了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值