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中写入了较大的值所引起。在nginx.conf中,将client_header_buffer_size和large_client_header_buffers都调大后可解决”,一看就知道这肯定不是我这种情况的解决办法,这是由于不知道什么原因引起的死循环将IP地址串写入请求头,直到缓存爆了才返回400,如果将缓存设置更大,只会造成日志增加速度变大而已。从分析来看应该是nginx出现的问题。
没有办法只能在打开nginx配置文件分析,问题站点的配置文件,如下图,并没有发现什么问题

打开nginx.conf进行慢慢研究,发现多了几行代码
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造成死循环,不知道大家有没有遇到过这种情况。
# 使用反向代理方式
# 正常的配置
upstream xxx{
server 127.0.0.1:;
}
upstream yyy {
server 127.0.0.1:;
}
# 异常配置
upstream xxx1{
server xx.xxx.com;
}
upstream yyy2 {
server yyy.xxx.com;
}
# 使用跳转方式
# 正常配置
proxy_pass http://127.0.0.1:23456; # 异常配置
proxy_pass http://xx.xxx.com;
版权声明:
本文由AllEmpty原创并发布于博客园,版权与博客园共同所有,欢迎转载,未经本人同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如有问题,可以通过1654937@qq.com 联系我,非常感谢。
发表本编内容,主要是为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:669058475 ,大家一起探讨。
更多内容,敬请观注博客:http://www.cnblogs.com/EmptyFS/
nginx配置反向代理或跳转出现400问题处理记录的更多相关文章
- Windos环境用Nginx配置反向代理和负载均衡
Windos环境用Nginx配置反向代理和负载均衡 引言:在前后端分离架构下,难免会遇到跨域问题.目前的解决方案大致有JSONP,反向代理,CORS这三种方式.JSONP兼容性良好,最大的缺点是只支持 ...
- Linux - Nginx配置反向代理。
Nginx配置反向代理. 准备两台服务器 http://192.168.70.66 http://192.168.70.62 设置正则匹配(192.168.70.66) vim /usr/local/ ...
- CentOS 7 安装 Nginx 配置反向代理
Linux使用Nginx Yum存储库上安装Nginx,适用于Red Hat Enterprise Linux和CentOS系统. 1.添加设置Nginx Yum存储库 在CentOS中首次安装Ngi ...
- [笔记]nginx配置反向代理和负载均衡
1.nginx配置文件:源码安装情况下,nginx.conf在解压后的安装包内.yum安装,一般情况下,一部分在/etc/nginx/nginx.conf中,一部分在/etc/nginx/conf.d ...
- windows版 nginx配置反向代理实例教程 跳转tomcat和php网站
抄自 https://www.cnblogs.com/j-star/p/8785334.html 个人理解 nginx端口设置为80,简称n tomcat端口设置为其他,例如8080,简称t php网 ...
- nginx配置反向代理详细教程(windows版)
内容属于原创,如果需要转载,还请注明地址:http://www.cnblogs.com/j-star/p/8785334.html Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(I ...
- nginx笔记 安装nginx 配置 反向代理 多虚拟主机
1,检测linux上是否 通过yum安装了nginxrpm -qi nginx 2.安装nginx之前的依赖包yum install gcc patch libffi-devel python- ...
- nginx 配置反向代理,负载均衡实战解析
前言:NGINX的反向代理和负载均衡是网站架构中经常用到的一种高并发,高可用的方案,下面我们直接实战操作,当然理论也是要的. 一.反向代理 过程:反向代理:客户端 一>代理 <一> ...
- nginx 配置反向代理和静态资源
https://unit.nginx.org/integration/ 与NGINX集成 在NGINX后面安装单元 将NGINX配置为静态Web服务器,并在Unit前面配置反向代理. NGINX直接从 ...
随机推荐
- “.Net 社区虚拟大会”(dotnetConf) 2016 Day 3 Keynote: Scott Hanselman
美国时间 6月7日--9日,为期三天的微软.NET社区虚拟大会正式在 Channel9 上召开,美国时间6.9 是第三天, Scott Hanselman 做Keynote.今天主题围绕的是.NET ...
- HTML DOM 对象
本篇主要介绍HTML DOM 对象:Document.Element.Attr.Event等4个对象. 目录 1. Document 对象:表示文档树的根节点,大部分属性和方法都是对元素进行操作. 2 ...
- 认识 Azure
本文为官网摘录总结
- 走进缓存的世界(三) - Memcache
系列文章 走进缓存的世界(一) - 开篇 走进缓存的世界(二) - 缓存设计 走进缓存的世界(三) - Memcache 简介 Memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用 ...
- ecshop验证码
<?php //仿制ecshop验证码(四位大写字母和数字.背景) //处理码值(四位大写字母和数字组成) //所有的可能的字符集合 $chars = 'ABCDEFGHIJKLMNOPQRST ...
- HTML简单入门内容
常用属性: Width=宽度 Height=高度 Size=大小 Color=颜色 Align=布局方向,值包括(top,bottom,left,right,center)上,下,左,右,中. Bor ...
- 推荐10款超级有趣的HTML5小游戏
HTML5的发展速度比任何人的都想像都要更快.更加强大有效的和专业的解决方案已经被开发......甚至在游戏世界中!这里跟大家分享有10款超级趣味的HTML5游戏,希望大家能够喜欢! Kern Typ ...
- jQuery遮罩层登录对话框
用户登录是许多网站必备的功能.有一种方式就是不管在网站的哪个页面,点击登录按钮就会弹出一个遮罩层,显示用户登录的对话框.这用方式比较灵活方便.而现在扫描二维码登录的方式也是很常见,例如QQ.微信.百度 ...
- android绘制圆形图片的两种方式
看下效果先 下面有完整的示例代码 使用BitmapShader(着色器) 我们在绘制view 的时候 就是小学上美术课 用水彩笔在本子上画画 使用着色器绘制圆形图片最简单的理解方式 就是把bitmap ...
- 邻接表的广度优先遍历(java版)
到 0 的权是 91 到 2 的权是 31 到 3 的权是 61 到 4 的权是 7 2 到 0 的权是 22 到 3 的权是 5 3 到 0 的权是 33 到 4 的权是 1 4 到 2 的权是 2 ...