Nginx的session一致性问题

本文详细解析了Session的工作原理,包括会话cookie的生命周期及其实现机制。针对多服务器环境下的Session一致性问题,介绍了通过session集群(如memcached或redis)实现Session数据共享的方法。

、我们知道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集群的搭建,有兴趣的朋友可以私信我,共同探讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值