nginx配置反向代理或跳转出现400问题处理记录
午休完上班后,同事说测试站点访问接⼝出现400 Bad Request  Request Header Or Cookie Too Large提⽰,⼼想还好是测试服务器出现问题,影响不⼤,不过也赶紧上服务器进⾏测试查看,打开nginx与ugwsi⽇志与配置,发现后端服务⽇志记录正常,⽽测试站点的访问⽇志有7百多M(才运⾏两三天没⼏个访问,⼏M的话才是正常现象),在浏览器⾥直接访问后端服务接⼝也正常没有问题(我们的服务器软件架构是微服务架构,将很多模块分拆后分别部署,前端是⼀个纯HTML站点,通过AJAX访问后端各个服务,由于访问量不⼤,所以前端站点的nginx配置时,做了反向代理访问后端其他服务,这样就不会出现跨域和需要处理多⼦域名事情——即访问不同的服务时,只需要使⽤当前域名就可以了,这样前端开发⼈员不必要知道后端挂载了多少服务需要使⽤什么对应的域名访问)。访问这台服务器上的其他站点都能正常访问,⽽问题站点的html页⾯也能正常打开......在测试过程中发现,每访问⼀下问题接⼝,访问⽇志就增加30多M,刷了⼏
次,nginx⽇志⼤⼩直线上升......
  由于⽇志⽐较⼤,只能使⽤tail -n 5000 xxx_access.log >> xxx.log截取⼀下最新的⽇志记录下载下来,打开⼀看发现同⼀时间⼀个访问,⽣产了2000多条重复循环的访问记录,⽽⽇志尾部$http_x_forwarded_for部分,有规律的存储了相同的由多到少的IP字串,即:最后⼀条有⼀个IP字串(
真实IP),倒数第⼆条有两个IP字串(真实IP + 服务器本地IP),倒数第三条有三个IP字串(真实IP + 两个服务器本地IP),以⾄类推
  百度了⼀下“400 Bad Request  Request Header Or Cookie Too Large”,查出来的⼏乎都是说“nginx 400 Bad request是request header过⼤所引起,request过⼤,通常是由于cookie中写⼊了较⼤的值所引起。在f中,将
client_header_buffer_size和large_client_header_buffers都调⼤后可解决”,⼀看就知道这肯定不是我这种情况的解决办法,这是由于不知道什么原因引起的死循环将IP地址串写⼊请求头,直到缓存爆了才返回400,如果将缓存设置更⼤,只会造成⽇志增加速度变⼤⽽已。从分析来看应该是nginx出现的问题。
nginx部署前端项目  没有办法只能在打开nginx配置⽂件分析,问题站点的配置⽂件,如下图,并没有发现什么问题
  打开f进⾏慢慢研究,发现多了⼏⾏代码
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  这是⽤来将当前访问⽤户的IP传给后端服务器⽤的,将它们删除重新启动⼀下服务器nginx后测试了⼀下,发现能正常访问了...o my god,再将它放回去,重启,访问,挂了,去掉,重启,访问,正常......重试了好⼏次,终于确定就是突然多出来的⼏⾏代码引起的。(后来问了⼀下同事才知道是他进服务器添加的)
  难道真的是不能使⽤吗?记得以前⽤过还是正常的。尝试访问预⽣产环境接⼝,正常。打开预⽣产环境的nginx配置,包函有这三⾏代码,如下图
  全⾯对⽐后发现,⽣产环境⽤的nginx配置是域名,⽽预⽣产环境⽤的是IP+端⼝,除此之外没有任何区别,使⽤跳转⽅式与反向代码⽅式测试,结果都是⼀样,添加port_in_redirect、server_name_in_redirect配置也没能解决
  综合分析,应该是nginx在使⽤proxy_pass做跳转时,如果直接使⽤域名,且需要向后端提交当前访问的IP地址时,引发nginx的bug 造成死循环,不知道⼤家有没有遇到过这种情况。
.:.:
# 使⽤跳转⽅式
# 正常配置
proxy_pass  127.0.0.1:23456;# 异常配置
proxy_pass  xx.xxx;
版权声明:
  本⽂由AllEmpty原创并发布于博客园,版权与博客园共同所有,欢迎转载,未经本⼈同意必须保留此段声明,且在⽂章页⾯明显位置给出原⽂链接,否则保留追究法律责任的权利。如有问题,可以通过1654937@qq 联系我,⾮常感谢。
 发表本编内容,主要是为了和⼤家共同学习共同进步,有兴趣的朋友可以加加Q:669058475 ,⼤家⼀起探讨。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。