设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 7396|回复: 0

[nginx] 捉急啊nginx狂飙502错误 [复制链接]

Rank: 6Rank: 6

签到
156
注册时间
2011-2-22
最后登录
2017-4-27
在线时间
161 小时
阅读权限
70
积分
9147
帖子
293
主题
121
精华
0
UID
12099
发表于 2017-4-26 21:48:08 |显示全部楼层
本帖最后由 qiuzugen 于 2017-4-26 21:52 编辑

先摆出服务架构:
A10(硬件设备)做负载均衡,下面挂载11台rs,rs上部署nginx,rs上配置lo:0, 负载均衡的模式类似于lvs的dr模式,关闭arp:
echo "1"> /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1"> /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

nginx上通过外网域名转发(loction + upstream的模式)到后端服务上去,(nginx上开通了外网nat回源)

问题描述:
客户端(android app)一个请求过来:比如http://www.aaa.com/aaa/?index=xxx, 我在nginx将其转发到http://www.bbb.com/aaa/?index=xxx的服务上去,
结果:access_log中出现502的占比高达30%左右,当然大部分还是200,日志如下:
111.14.233.184 - - [24/Apr/2017:14:41:00 +0800] "www.aaa.com" "POST /mstat/report/?index=1493003035 HTTP/1.1" 502 24 "7.000" "7.000" "-" "111.111.111.111:80" "-" "-" "-" "-" "-"
一律是7s的超时,我的proxy_connect_timeout 10s; 设置的是都是10s啊,整个nginx没有任何一个地方设置过7s的超时啊
2017/04/26 21:36:10 [error] 57345#0: *5668043 connect() failed (110: Connection timed out) while connecting to upstream, client: 183.255.207.129, server: www.aaa.com, request: "POST /mstat/report/?index=1493213731 HTTP/1.1", upstream: "http://111.111.111.111:80/mstat/report/?index=1493213731", host: "www.aaa.com:80"

定位过程:
1、怀疑后端服务www.bbb.com服务负载较高,查看没有问题。而且这个服务直接通过www.bbb.com提供给很多其他业务使用都没有问题。
2、怀疑负载均衡设备或防火墙哪里有7s的超时设置,让工程师检查、抓包都没有。
3、nginx机器上的域名解析问题,改成了直接转发到www.bbb.com的ip, ping ip的延时在10ms左右,也没有问题。
4、根据tcp协议四元组:源ip、源端口、目的ip、目的端口的特征,检查了nginx机器是端口范围是net.ipv4.ip_local_port_range = 1024     65535,而且链接数限制是100w+, 没有达到上限,目的ip那里在upsream里面配置了9个vip, 也不可能是这个原因。
5、在nginx机器上抓包:发现用wireshark随便选择一个http.response.code == 502的包,然后右键选择"Follow TCP Stream",无法追究到上游(客户端)是什么时候发给nginx的,只能看到nginx返回给了上游,这是非常奇怪的,抓到的502包,是找不到之前的tcp包流的,也看不到之前上游跟nginx之前的连接建立信息啊,按理来说,能抓到返回包,那肯定能抓到请求包,除非这个返回包是nginx捏造返回的,根本就没有请求过来---很奇怪。然后看了其他业务返回的504,抓包确实也是这样。。。。
6、用http.response.code == 502抓502的包时发现:抓到的502都是nginx服务器返回给用户的,而从nginx日志里面来看,明明是在从nginx转发到后端www.bbb.com的时候出现的502,而从抓包看不到从www.bbb.com回给nginx502这一回包过程,这是怎么回事呢?

麻烦大侠们帮忙看看。

该贴已经同步到 qiuzugen的微博
您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢您的支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2017-8-17 15:50 , Processed in 0.016919 second(s), 11 queries , Apc On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部