在tomcat+nginx分布式环境下,如果有一台服务器挂掉,那个它上面的session则会消失(session是保存在服务器上面),那么我们怎么解决这个问题?我们可以把信息保存在cookie中(cookie是保存在客户端,也就是游览器),但是,这样是不安全的,下面我要介绍的是用redis保存session信息,而达到session共享(我也是刚看别人的博客,搭建出来,有些注意的地方要知道)。

1、需要3个jar包,分别是commons-pool2-2.3.jar,jedis-2.7.2.jar,tomcat-redis-session-manager1.2.jar(这个jar包我是直接下载的,没去原版的github拉取。),将3个jar包放在每台服务器tomcat的lib当中。

2、配置tomcat的context.xml文件,将redis链接配置(以及使用tomcat-redis-session-manager1.2.jar进行session的存储共享)到当中,如下:

<!-- 利用redis 进行session 共享 单例模式 只有一台redis -->
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="127.0.0.1"
port="6379"
database="0"
maxInactiveInterval="3600"/>
 

<!-- redis-Sentinel 配置 多例模式  -->
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
    maxInactiveInterval="60"
    sentinelMaster="mymaster"
    sentinels="127.0.0.1:26379,127.0.0.1:26479" />

我们这里使用单例模式,redis集群,在接下来几篇会有

        注意:一定要反编译你拿到的tomcat-redis-session-manager1.2.jar包,看看RedisSessionHandlerValve.class、RedisSessionManager.class的路径(之前直接复制网上的配置,发现找不到类,然后反编译jar包找到对应的位置),如果你的redis有密码,则在manager下面加入
password="????",如果没有密码,不要加入这段!。

3、nginx的配置

这个其实不需要的和redis没关联,只是测试的时候,为了看出效果如下:

upstream localhost {
                server localhost:8090 weight=1;
        server localhost:8080 weight=1;
       #ip_hash;
    }

注意上面的ip_hash,它的作用是如果用户在服务器1进行登录,
之后的所有操作都会在服务器1上进行,

如果没有它,那么,用户的所有操作都将是交给nginx进行分配的,现在我们这里把它注释掉,测试

的时候登录之后进行操作,各个服务器将是共享的,可能在1,可能在n,那么session也是共享的,

然后,将其中一台服务器停掉,继续操作,结果当然是在其他服务器上执行,现在,我们将ip_hash

加上,继续之前的操作,从头再来,结果。。。。。你懂的。


Logo

更多推荐