Nginx负载均衡部署多台Web服务器出现Session信息不同步问题解决方案

在Nginx负载均衡部署多台Web服务器时,由于session信息不同步导致用户登录后发起其他请求会跳转到登录页面。解决方案包括:1) 粘带session,通过IP哈希策略确保用户请求集中在同一台服务器,但存在单点故障风险;2) session复制,通过Tomcat的会话复制功能实现Session同步,但内存消耗较大;3) Session共享,利用Spring Session结合Redis等缓存进行Session同步,适合大型分布式环境,但需要配置且消耗CPU性能。
摘要由CSDN通过智能技术生成

应用部署架构:

在这里插入图片描述

问题描述:

用户登录后,发起其他请求会跳转到登录页面。

问题产生原因:

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" />
    <
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值