Nginx的session一致性问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31246691/article/details/81517186

、我们知道Session的常见形式是会话cookie,即为设置过期时间的cookie,它的默认的生命周期为浏览器会话期间,一旦浏览器关闭窗口,这个cookie就消失了。其实现机制为:当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionID,如果不包含,则服务器会生成一个名为JSESSIONID的cookie返回到浏览器,(这个cookie存放在内存中,并不会存在硬盘)。同时在服务器端以HashTable的形式写到服务器内存中;当请求中包含sessionID时,服务器端会在HashTable中查找与该session相匹配的信息,若存在则直接使用该sessionID,否则重新生成新的session。
二、 Session共享:如果网站是存放在一台机器上,是不存在session共享这个问题的,因为所有的会话数据都在这一台机器上。但是,现在的网站大部分都是需要做负载均衡的,即需要把用户的请求分发到不同机器,当然这时会话ID在客户端是不存在问题的,但是服务端会出现取不到session数据的情况。如下图:
这里写图片描述
在该架构中,采用Nginx做负载均衡,两个Tomcat做后端服务器,假设当客户端第一次请求时,Nginx将其分发到了Tomcat1,这时候Tomcat1会产生sessionID返回给客户端,并同时保存在自己的内存中;当客户端第二次请求时,Nginx将其分发到了Tomcat2,这时便无法取到session。从而就会重新生成session,返回给客户端,并保存在自己的内存中。两台Tomcat中保存的同一个用户的session不同,这便是session的一致性问题。
为了解决这个问题,首当其冲,我会想到,将Tomcat1中的session复制到Tomcat2中即可,当然是可以的,但是不方便,因为这里只有两台服务器,而当后台服务器增多时,会很麻烦。从而,便有了如下的解决方法:
这里写图片描述
即,将session分离出来,每个服务器都是从该session服务器(集群)中获取。这样以来,新增加的服务器也只需从session集群中获取。
(session集群可以通过memcached或redis来实现)
关于session集群的搭建,有兴趣的朋友可以私信我,共同探讨。

猜你喜欢

转载自blog.csdn.net/qq_31246691/article/details/81517186
今日推荐