关于nginx负载均衡session丢失问题及解决思想

1. 没有nginx存在时
浏览器第一次请求,会发送一个cookie,但没有携带session相关的信息,tomcat收到这个浏览器的请求之后,会查看cookie中是否包含了session信息,没有的话会在JVM中的session容器中创建一个session对象,并有一个唯一对应的sessionId,服务器处理完请求响应给浏览器时,会将这个新创建的sessionId以及对应的session对象存入cookie中发给浏览器,浏览器收到该cookie之后存储在浏览器缓存中,至此第一次请求响应完毕。
以后浏览器每次发请求都会携带此cookie到tomcat服务器,cookie是以(name:value)形式存在,即携带的是sessionId,以及对应的session对象。tomcat收到这样的cookie之后会拿到sessionId与session容器中存储的session对象进行对比,一致的话就不会新创建session对象表示这个session有效,会采用现存的session对象进行操作。否则session已经过期,需要创建新的session对象重复上述操作,处理完响应浏览器还是会将此cookie发送给浏览器(若浏览器存在一样的cookie就是覆盖操作)。
由于是单台tomcat,不会有session丢失的情况。
图解:
关于nginx负载均衡session丢失问题及解决思想_第1张图片

2. nginx负载均衡处理tomcat集群(假设2个tomcat)
存在nginx情况,无非中间是通过nginx负载均衡到各个tomcat,浏览器发送cookie给nginx,再有再由nginx转交到各个tomcat,这里的原理与上述一致,不同的是由nginx负载均衡之后,服务器可能发生改变,但由于各个tomcat服务器JVM中session容器不共享,所以每次切换浏览器,都会发生session不一致情况,也即原来的session丢失了(tomcat发现sessionId不一致会认为浏览器发送的session已经过期,会新创建session进行覆盖),所以必须要有一个共享的存储session的地方,这样每次session都会是同一个,就不会发生session丢失。一般采取redis作为存储,springsession底层也是基于redis的。
图解:关于nginx负载均衡session丢失问题及解决思想_第2张图片

你可能感兴趣的:(nginx,nginx,负载均衡,tomcat)