nginx学习

樱木花道VS康 发布于 2018/04/08 17:37
阅读 507
收藏 0

大家好最近学习nginx时学到负载均衡session共享问题,

我的理解:浏览器访问web项目后台将登陆信息放入httpsession(我的例子是一个简单的servlet程序),

HttpSession session = request.getSession();
session.setAttribute("name", "樱木花道");

若是同一个浏览器退出前,name一直在session中,用于比如每个界面头部:登录人:${name}等。

由于session存与tomcat服务器中,是有nginx负载的时候,如果张三访问了tomcat1登陆,如果在访问到tomcat2那么就得不到session值了,所以需要共享session。

我的理解有问题吗?请大神指正。

我的问题:

1.按我的理解,如果张三第一次访问了tomcat1并set的session值,如果另一个请求访问了tomcat2想获取session自然获取不到,如果再次刷新,让nginx将这次请求负载到tomcat1上,由于之前登录时在tomcat1上,按道理这时能获取session吧?我的小例子获取不到。。。

加载中
0
樱木花道VS康
樱木花道VS康

引用来自“混乱羽翼”的评论

你画的图的意思是,tomcat1把session存放到redis里面,然后tomcat2也从redis中读取session,实现共享session的作用,这样子无论nginx的负责均衡策略是ip_hash还是别的,都不存在session取不到的问题了

你自己写的例子,你获得了session,你需要把它存到redis里面,或者你可以用spring-session来配置实现

感谢您的回答,不好意思我的图有歧义,我把另一个问题删除了,图没改,忽略redis这部分,我其实想问,nginx负载的时候,第一次访问tomcat1保存session,往下操作时访问了tomcat2应该取不到session因为session存在tomcat1中,如果再次刷新让这个请求到tomcat1那么是不是能取到呢?简而言之,就是tomcat1保存了session,再次负载到tomcat1时时有session值的对吧?

樱木花道VS康
樱木花道VS康
谢谢!
混乱羽翼
混乱羽翼
对的,不用redis的情况下,哪个tomcat存的session,就只能哪个取得到了,不过一般你可以通过nginx配置ip_hash策略,让同一个IP地址,一直都负载到同一个tomcat来解决,算是一个笨办法
0
皇太极
皇太极
sessionid由服务端产生,你需要检测下浏览器从Tomcat1再到Tomcat2再到Tomcat1,这个过程浏览器的sessionid的变化
樱木花道VS康
樱木花道VS康
确实不一样了,jsessionid一直在变化,没有nginx的话,只访问tomcat2没有问题,每次请求都是一样的sessionid,使用nginx负载tomcat1、tomcat2的话,sessionid一直是新的,,,
0
混乱羽翼
混乱羽翼

你画的图的意思是,tomcat1把session存放到redis里面,然后tomcat2也从redis中读取session,实现共享session的作用,这样子无论nginx的负责均衡策略是ip_hash还是别的,都不存在session取不到的问题了

你自己写的例子,你获得了session,你需要把它存到redis里面,或者你可以用spring-session来配置实现

返回顶部
顶部