问题描述:
在公司项目中,采用了双机部署,负载均衡方式采用iphash
upstream xxxx {
ip_hash;
server 192.168.241.1:8080; #服务器A
server 192.168.241.1:8010; #服务器B
}
在测试阶段,有一定几率产生,正常操作确存在退出登录界面的问题。
最开始分析是,网络问题,登录请求刚开始转发到服务器A,服务器A有session,其他的请求转发到服务器B,服务器B没有session导致退出系统。分析nginx日志,确没有发现这样的问题,我很是疑惑。。
但是却发现nginx日志中有这样的情况
192.168.241.1:8080, 192.168.241.1:8010 | 0.202, 0.302 | 500, 500 || "GET /client-web/pages/stbManager/initStb.do HTTP/1.1" 500
请求client-web/pages/stbManager/initStb.do,同时转发到两个服务器,这就很奇怪。。而且这种情况大部分是发生500 404 等错误才会发生的,而且紧接着就会有这样的日志
192.168.241.1:8010 | 0.014 | 200 || "GET /client-web/pages/manage/login/sysOut.do HTTP/1.1" 200
也就是服务器B(8010)会退出系统,这很好理解,用户在服务器A登录,请求转发到B上,B系统没有session发生退出,很正常。但是服务器A上的那个用户为什么会退出?还有为什么会发生一个请求转发到两个地址?
一个请求转发到两个地址
进过分析公司的nginx日志发现有这样的配置
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
意思就是如果发生超时,500 503 404 等错误会转到其他的服务器上。这个也就是nginx的重试机制。
服务器A的用户退出的原因
通过调试程序发现,用户A的请求中有sessionid,当这个请求转发到服务器B上,服务器将这个请求跳转到登录界面,所以用户A会跳转到登录界面的原因。
解决问题
- 谨慎使用重试机制,这回造成很多问题。将重试机制注销掉。