Nginx 如何调试未关闭的关闭等待连接的原因?(tcpdump等)
我们在同一台主机上安装了Java应用程序和Nginx作为反向代理。周期性地,我们得到Nginx 如何调试未关闭的关闭等待连接的原因?(tcpdump等),nginx,networking,tcp,wireshark,tcpdump,Nginx,Networking,Tcp,Wireshark,Tcpdump,我们在同一台主机上安装了Java应用程序和Nginx作为反向代理。周期性地,我们得到CLOSE\u WAIT长时间挂起的连接: $ ss -n4t | head State Recv-Q Send-Q Local Address:Port Peer Address:Port CLOSE-WAIT 1 0 127.0.0.1:8180 127.0.0.1:36599 CLOSE-WAIT 1 0 127.0.
CLOSE\u WAIT
长时间挂起的连接:
$ ss -n4t | head
State Recv-Q Send-Q Local Address:Port Peer Address:Port
CLOSE-WAIT 1 0 127.0.0.1:8180 127.0.0.1:36599
CLOSE-WAIT 1 0 127.0.0.1:8180 127.0.0.1:36467
CLOSE-WAIT 1 0 127.0.0.1:8180 127.0.0.1:36154
而且它们的数量在增加,那么应用程序就有问题了。
互联网上说:
Your server is failing to detect client disconnects, or ignoring them, and not closing the socket.
Nginx说:
2020/06/28 04:59:15 [error] 65506#0: *31719640 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 55.55.55.55, server: app.mycompany.com, request: "POST /url/url HTTP/1.0", upstream: "http://127.0.0.1:8180/url/url/provider", host: "app.mycompany.com"
好的,tcpdump
在正常行为期间显示:
2020-06-08 06:58:23.073139 IP 127.0.0.1.8180 > 127.0.0.1.57786: Flags [P.], seq 1:738, ack 1211, win 1365, options [nop,nop,TS val 2780380992 ecr 2780380974], length 737
2020-06-08 06:58:23.073233 IP 127.0.0.1.8180 > 127.0.0.1.57786: Flags [F.], seq 738, ack 1211, win 1365, options [nop,nop,TS val 2780380992 ecr 2780380992], length 0
2020-06-08 06:58:23.073302 IP 127.0.0.1.57786 > 127.0.0.1.8180: Flags [F.], seq 1211, ack 739, win 353, options [nop,nop,TS val 2780380992 ecr 2780380992], length 0
两侧的[F.]
表示连接已正确关闭(基于)
接下来,tcpdump
在异常行为期间(当CLOSE\u WAIT
borns时)显示:
这里我们只看到一个[F.]
我已经阅读了数千篇文章,但仍然难以回答以下问题:
tcpdump[F.]
标志实际上是什么意思?文档中说:占位符,通常用于确认。
,但第一个初始FIN(没有确认)在哪里,如:
我的问题是,tcpdump
将FIN和FIN/ACK组合成[F.]
标志?如果是这样,在正常行为期间,我们会看到以下操作顺序:
被tcpdump忽略
127.0.0.1.8180>127.0.0.1.57786:标志[F.]
被tcpdump忽略
127.0.0.1.57786>127.0.0.1.8180:标志[F.]
[F.]
对吗?
第二个问题是Nginx。正如我在netstat
上所理解的:
CLOSE-WAIT 1 0 127.0.0.1:8180 127.0.0.1:36467
连接正在从本地主机连接到本地主机是因为Nginx反向代理吗?这就是为什么我看不到真正的客户端IP?如果是这样,Java应用程序和Nginx之间会有问题吗?我这样问是因为我想调试/监视HTTP通信,包括从localhost到localhost的请求和响应头以及消息体:
tcpdump -A -s 0 'tcp port 8180 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -i lo
tcpdump-A-s0'tcp端口8180和((ip[2:2]-((ip[0]&0xf)2))!=0)–i低
因为我们在Nginx上有SSL终止,我相信我会看到服务器/客户端流内部发生了什么。第三个问题是,这是正确的方法吗/有没有其他方法可以清楚地理解我们“接近”等待的根本原因?
CLOSE-WAIT 1 0 127.0.0.1:8180 127.0.0.1:36467
tcpdump -A -s 0 'tcp port 8180 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -i lo