为什么集群环境下,会出现session不一致问题?
答:使用nginx的负载均衡之后,不确定访问哪个tomcat,导致客户端存储的jsessionid携带到集群环境下的其他tomcat是无效的。
关于集群环境下,解决session不一致问题?
方式1:负载均衡的策略ip黏着:在nginx的default.conf配置ip_hash,这样客户端会固定的访问某一台服务器
方式2:使用redis管理集群环境的session,session对象不在存储在tomcat服务器,而是redis数据库中,如下图所示:
实现原理描述:
客户端访问nginx,分配到tomcat-1服务器,创建session对象,jsessionid,将jsessionid作为key,session对象作为value存到redis数据库中,随着响应将jsessionid返回给客户端浏览器,该客户端浏览器向nginx在次发出请求,写cookie(包含jsessionid),到nginx后被分配到tomcat-2服务器,tomcat-2获取cookie中的jsessionid,去redis数据库查找对应的session对象并且返回使用
实现步骤:
1.将下边三个jar上传到tomcat服务器中的lib目录下
要重写tomcat的session实现方法,将session管理到redis服务器中
如下图所示:
2. 修改tomcat中conf目录下的context.xml
原因1:我们上传的jar中的类,替换了tomcat中的代码,需要让tomcat知道我们的类叫什么名字
原因2:配置redis数据库所在服务器的ip地址和redis数据库的端口号
3. 重启tomcat服务
进入bin目录 ,先执行./shutdown.sh 再执行./startup.sh
注意:以上操作集群中的tomcat(有几个就操作几个)都是相同的操作
4,测试
做一个登陆页面,测试一下上面的操作有没有成功