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,写相关配置文件即可
具体实施步骤,等下一章写。