- 论坛徽章:
- 0
|
先摆出服务架构:
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这一回包过程,这是怎么回事呢?
麻烦大侠们帮忙看看。
|
|