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直接从 ...
随机推荐
- Windows server 2012 添加中文语言包(英文转为中文)(离线)
Windows server 2012 添加中文语言包(英文转为中文)(离线) 相关资料: 公司环境:亚马孙aws虚拟机 英文版Windows2012 中文SQL Server2012安装包,需要安装 ...
- 我们是怎么做Code Review的
前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大家一起分享.探讨.我们为什么要推行Code ...
- 【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1277 视频直 ...
- 【Web动画】SVG 线条动画入门
通常我们说的 Web 动画,包含了三大类. CSS3 动画 javascript 动画(canvas) html 动画(SVG) 个人认为 3 种动画各有优劣,实际应用中根据掌握情况作出取舍,本文讨论 ...
- 基于ASP.NET/C#开发国外支付平台(Paypal)学习心得。
最近一直在研究Paypal的支付平台,因为本人之前没有接触过接口这一块,新来一家公司比较不清楚流程就要求开发两个支付平台一个是支付宝(这边就不再这篇文章里面赘述了),但还是花了2-3天的时间通 ...
- 更愉快的书写CSS
我在写CSS的时候经常会碰到些麻烦事儿: 1)看上去蛮简单的排版却写了很久 2)代码写的越来越散,总是这里补一句,那里补一句,没有条理性 3)margin.padding.font-size等属性在不 ...
- .Net Core上也可以使用的二维码组件
我Fork了QRCoder,并且兼容了.Net Core,图形库用的是ZKWeb.System.Drawing Github: https://github.com/zkweb-framework/Q ...
- Unity3D 5.3 新版AssetBundle使用方案及策略
1.概览 Unity3D 5.0版本之后的AssetBundle机制和之前的4.x版本已经发生了很大的变化,一些曾经常用的流程已经不再使用,甚至一些老的API已经被新的API所取代. 因此,本文的主要 ...
- LINQ to SQL Where条件
1. 适用场景 实现条件的过滤和查询等功能. 2. 说明 跟SQL语句中的where作用相似,都起到了范围的限定即过滤的作用,而判断条件是紧跟后面的条件子句.where主要分为三种形式:简单形式.条件 ...
- 【Java每日一题】20170106
20170105问题解析请点击今日问题下方的"[Java每日一题]20170106"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...