首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么nginx在收到客户端FIN后不立即关闭连接?

问为什么nginx在收到客户端FIN后不立即关闭连接?
EN

Server Fault用户
提问于 2019-11-23 13:22:42
回答 2查看 1.4K关注 0票数 1

问题:我们已经建立了一个CDN提供者作为我们的静态映像文件服务器的代理。几个小时后,我们经历了大量的TCP,SYN下降率和异常高数量的孤立连接。

观察是为了解决这个问题:我捕获了1.5秒的服务器流量,并检查了一些图像下载。令人怀疑的是,nginx --它几乎配置了缺省值--正在响应CDN服务器的FIN数据包,而不是使用FIN/ACK。在nginx的ACK之后,连接端口上会有整整一秒的沉默,这意味着服务器没有什么可以发送的了。由于交通拥堵,我无法捕捉超过1.5秒。

下面是一个示例TCP连接的摘要:

代码语言:javascript
复制
No.     Time        Source      Destination Proto   Length and Info 
20      0.004281671 [CDN IP]    [NGINX IP]  TCP     74  20200 → 443 [SYN] Seq=0 Win=28400 Len=0 MSS=1420 SACK_PERM=1 TSval=2822189024 TSecr=0 WS=1024
21      0.004333161 [NGINX IP]  [CDN IP]    TCP     74  443 → 20200 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 TSval=2611883387 TSecr=2822189024 WS=128
372     0.125341624 [CDN IP]    [NGINX IP]  TCP     66  20200 → 443 [ACK] Seq=1 Ack=1 Win=28672 Len=0 TSval=2822189148 TSecr=2611883387
373     0.125357371 [CDN IP]    [NGINX IP]  TLSv1.2 287 Client Hello
374     0.125367976 [NGINX IP]  [CDN IP]    TCP     66  443 → 20200 [ACK] Seq=1 Ack=222 Win=30080 Len=0 TSval=2611883417 TSecr=2822189149
392     0.127328681 [NGINX IP]  [CDN IP]    TLSv1.2 2882    Server Hello, Certificate
393     0.127339623 [NGINX IP]  [CDN IP]    TLSv1.2 233 Server Key Exchange, Server Hello Done
645     0.244326565 [CDN IP]    [NGINX IP]  TCP     66  20200 → 443 [ACK] Seq=222 Ack=2984 Win=34816 Len=0 TSval=2822189267 TSecr=2611883418
646     0.244353033 [CDN IP]    [NGINX IP]  TLSv1.2 192 Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
647     0.244630520 [NGINX IP]  [CDN IP]    TLSv1.2 324 New Session Ticket, Change Cipher Spec, Encrypted Handshake Message
1121    0.360323576 [CDN IP]    [NGINX IP]  TLSv1.2 1496    Application Data    
1122    0.360373767 [NGINX IP]  [CDN IP]    TCP     66  443 → 20200 [ACK] Seq=3242 Ack=1778 Win=33024 Len=0 TSval=2611883476 TSecr=2822189383
1123    0.360539425 [NGINX IP]  [CDN IP]    TLSv1.2 392 Application Data    
1124    0.360614290 [NGINX IP]  [CDN IP]    TLSv1.2 97  Encrypted Alert 
1554    0.477351117 [CDN IP]    [NGINX IP]  TCP     78  [TCP Window Update] 20200 → 443 [ACK] Seq=1778 Ack=3242 Win=40960 Len=0 TSval=2822189500 TSecr=2611883447 SLE=3568 SRE=3600
1555    0.477369934 [CDN IP]    [NGINX IP]  TCP     66  20200 → 443 [ACK] Seq=1778 Ack=3600 Win=43008 Len=0 TSval=2822189501 TSecr=2611883476
1596    0.505356016 [CDN IP]    [NGINX IP]  TCP     66  20200 → 443 [FIN, ACK] Seq=1778 Ack=3600 Win=43008 Len=0 TSval=2822189530 TSecr=2611883476
1597    0.505368886 [NGINX IP]  [CDN IP]    TCP     66  443 → 20200 [ACK] Seq=3600 Ack=1779 Win=33024 Len=0 TSval=2611883512 TSecr=2822189530

另外,我猜CDN服务器使用HTTP保持活动头。我不确定的分析是,CDN方面的错误配置使它能够为每个图像使用一个连接,以及发送保持活动的头。它使nginx使TCP保持活跃,FIN数据包仅由ACK响应。然后,解决办法是将nginx保持存活的超时时间减少到1秒。

问题是:造成这个问题的确切原因是什么?或者我应该改变什么来解决这个问题呢?

EN

回答 2

Server Fault用户

回答已采纳

发布于 2020-06-15 05:26:42

在我检查了请求的内容后,nginx的行为是由于CDN的行为造成的。因为CDN使用的是“保持活动”连接,而在nginx中保持活动连接的持续时间设置为60岁左右。当我把这个降到15秒时,情况就恢复正常了。

票数 0
EN

Server Fault用户

发布于 2019-11-23 16:03:24

你想要解决的问题是什么?

孤立连接和"SYN“并不是真正的问题。NGINX对这些细节的关注很少,据我所知。

你增加了一个CDN。而且CDN不是用户。因此,它的行为是不同的。

您可能正在耗尽池中的连接空间。增加这一点。

请张贴更多的具体问题,以进一步澄清。

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/993021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档