腾讯CLB下多级nginx 反向代理302错误异常记录
前言
最近公司接了一些外包项目服务,某个登录服务在这边政务云网络下正常,但通过了腾讯CLB下,服务直接出现302无限跳转的问题,就对此异常做个笔记记录。
问题及原因分析
问题
问题是因为第一次上CLB服务进行代理,在多级Nginx代理中因协议不一致导致的HTTPS显示不正常,导致服务无法判断协议头出现异常重复请求。
原因分析
通常的架构是内部的nginx之间采用的是http进行通讯,clb入口配置https,二级以及以上的nginx则是配置http。通常的架构配置如下图:
因为CLB这边只是简单配置了https,因此只能通过下一个NGINX配置与日志进行排查。
首先查看配置与这边生产配置一致。
但通过访问后,异常出现很多302跳转请求,如下图:
通过查看nginx1的日志,发现scheme请求过来的内容是http
,但是proto过来内容是https
。
在反馈此问题给技术同事后,告知因为代码协议头都是写死通过X-Forwarded-Scheme
,但是nacos配置文件写死以https://xxxxx.com
域名,导致服务协议头前后一致。
那后面明白了,是因为服务获取的协议内容,与配置文件以https
协议不一致造成的。
总而言之,在进行多级代理的时候,在多级Nginx代理中因协议不一致导致的HTTPS显示不正常,导致服务无法判断协议头出现异常重复请求。
在多级Nginx代理中,一级代理配置为HTTPS,而二级及以上的代理配置为HTTP,可能导致请求头中的
X-Forwarded-Proto
未正确设置,使得后端服务无法正确识别请求的协议。
解决方案
方案1:强制设置X-Forwarded-Proto
为https
方案2:通过X-Forwarded-Proto
传递协议,并动态设置
方案3:直接使用$http_x_forwarded_proto
进行设置
最终重新在Nginx1上设置配置后,正常访问: