记一次nginx代理转发127.0.0.1引起的cookie未写入

公司有平台地址:a.civaonline.cn,部署了一个新的服务,分配域名:b.civaonline.cn

为了实现sso登录服务,需要将token写入到一级域名*.civaonline.cn下,即统一在a.civaonline.cn登录,登录成功后将token写入cookie,这样在访问b.civaonline.cn时,就可以带上token自动验证通过,无需再次登录

 

测试环境验证通过,但在发布到预发环境时,遇到了一个头疼的问题:

预发环境在a.civaonline.cn登录成功后,访问b.civaonline.cn时,一直不能通过登录验证

 

排查过程

  1. 一开始怀疑是b.civaonline.cn配置文件错识,调用了测试环境的登录验证接口,但是通过检查配置文件和tail追踪日志,发现请求并没有错
  2. 后来清理了浏览器cookie和缓存后,发现用户登录成功后token并没有写到cookie中。What's the hell?这之期排查了半天,一直是有token的啊?这里也特别记录一下,这也是一个坑,因为测试环境的域名是testa.civaonline.cn,也将token写入到*.civaonline.cn,所以在测试环境登录成功后的token,在未过期,且没有及时清理的话,在访问预发的b.civaonline.cn地址时,也会带上,这就是为什么会导致1的误判的原因,我一直以为登录成功后写入token成功了,其实这仍然是测试环境的token
  3. 找到真正问题后,就有方向了,开发开始排查代码,加日志,并没有发现任何异常的地方,又有点找不到头绪了,因为预发环境和测试环境的代码都是一模一样的。
  4. 后来我与开发一起发现了一处if判断,意思是如果host=127.0.0.1,那么就跳过写cookie的过程,这是开发为了方便在本地开发环境调试用的。一开始我们都认为这段代码不是产生问题的原因,因为第一预发用的时域名访问,而且域名解析的ip也肯定不会是127.0.0.1,第二测试环境已经验证过了,不会进入这个逻辑里。但是我们都错了,确实就是这段代码的原因,为啥?为啥host=a.civaonline.cn,怎么变成了127.0.0.1了呢?因为nginx,通过nginx代理,当监听到a.civaonline.cn的时候,会自动将请求转发至具体的服务地址和端品,如192.168.0.100:xxxx,而正好我们的a.civaonline.cn与nginx是同一个服务器上,所以nginx就把请求转到了127.0.0.1:xxxx。至此,问题的原因找到,那么解决起来也就是举手之劳了。

 

最后,解释一下大家可能都想问的问题:那么测试环境为啥没有问题呢?

答:因为测试环境没有部署nginx,直接单机访问的服务。

 

幸好这个bug我们在预发环境发现,否则带到线上这可是个致命问题!另外,问题的解决可能就是一行代码的事,但是问题的排查却消耗了我们大量的精力,本来是打算12点搞定的,结果凌晨1点半发现这个问题,最后搞到了凌晨5点多

所以有了这次教训,我们在做测试时,测试环境一定要尽量与线上环境一致,否则就可能漏掉类似的测试场景。类似nginx负载均衡,服务发现,docker部署等。

 

感谢一下网友,本次bug的最终发现与解决,参考了网友乐途的博文:https://www.cnblogs.com/ykpkris/articles/12400941.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值