应用部署架构:
问题描述:
用户登录后,发起其他请求会跳转到登录页面。
问题产生原因:
session信息丢失而导致权限失去,请求失败。
现在集群中有两台Web服务器A和B,当用户登录请求被nginx分发到服务器A,服务器A调用request.session,并将用户信息存储到该服务器session中,登录成功跳转主页;如果这时用户发起其他请求如分页查询被nginx分发到服务器B,而服务器B中的session自然没有包含用户信息,所以未获得授权请求被拦截,跳转回登录页面。
所以,必须实现集群服务的Session同步。
解决方案:
1.粘带session
session sticky,基于ip的hash策略,当前用户的所有请求最终都会集中到一台服务器上,就是那台session里保存了用户信息的服务器,相当于单点部署,如果宕机,会话丢失。
具体做法:
修改nginx的配置文件:
upstream web_servers {
ip_hash;
server 192.168.xxx.101:8080;
server 192.168.xxx.102:8080;
}
优点:
配置简单、不入侵应用,方便服务器的水平拓展。
缺点:
服务器重启session丢失,面临较高的单点故障风险。
2.session复制
它是Tomcat提供的会话复制功能,可以适应多种负载均衡策略,因此不单单适用于nginx,主要是通过配置节点来实现Session同步,但是内存消耗会较为严重,尤其Session保存较大的对象更为显著。
具体做法:
<!--在sever.xml文件的host中配置如下代码-->
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false" notifyListenersOnReplication="true" />
<