Nginx Session共享《五》

1.概念

  在上一篇nginx负载均衡中,会出现一个bug: 当同一个用户第一次访问tomcat_8001 并且登录成功, 而第二次访问却被分配到了tomcat_8002, 这里并没有记录他的登陆状态,那么就会呈现未登录状态了

2.解决方法一:ip_hash

  通过ip地址标记用户,如果多次请求都是从同一个ip来的,那么就都分配到同一个tomcat.
这样就不会出现负载均衡session的bug了. 处理手段也很简单,如下图所示在upstream最后加上ip_hash;就行了。

  

upstream tomcat_8001_8002{
        server 127.0.0.1:8001 weight=1;
        server 127.0.0.1:8002 weight=2;    
        ip_hash;
}

  不过这种方案并不完美,当如下几种情况发生时就有问题:
  1. 大量请求来之某个局域网,那么相当于就没有负载均衡了
  2. 如果tomcat_8001 挂了,那么此时nginx只能把请求交给tomcat_8222,但是这里却没有记录session,用户体验依然受影响。

  解决方法二:redis+tomcat-sessoin-manager

  用Redis来存取session,这样当tomcat_8001需要保存session值的时候,就可以把它放在Redis上,需要取的时候,也从Redis上取。

  准备三个jar:tomcat-redis-session-manager1.2.jar(核心)、jedis-2.5.2.jar、commons-pool2-2.0.jar,都放在tomcat/lib目录下,两个tomcat都要放

  下载地址:https://share.weiyun.com/b41856840db4d696649f6020d34cb245

  修改tomcat/conf目录下的context.xml文件,新增:

  

<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />  
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"  
         host="localhost"   
         port="6379"  
         database="0"   
         maxInactiveInterval="60" />

  重启两个tomcat(带有登陆页),访问http://127.0.0.1

  输入登陆信息,然后关闭之前被访问的tomcat,在访问http://127.0.0.1

  发现跳转到已经是登陆的信息页面了,说明配置成功。

3.实际项目中的session共享

  通常项目都是由开源框架搭建的,其中spring是必不可少,而spring本身就支持redis,引入相关jar,写相关配置文件即可

  具体实施步骤,等下一章写。

  

  

  

  

  

  

posted @ 2018-01-30 18:29  anionic  阅读(195)  评论(0编辑  收藏  举报