反向代理"冷连接惩罚"

现象描述

场景 表现
公网访问网站 静态资源(HTML/JS/CSS)加载正常,速度稳定
小程序/公网调 API 接口响应时快时慢,无明显规律,偶发超时
内网直连服务器 同一接口毫秒级响应,服务端本身无性能瓶颈
公网监控数据 冷请求 TTFB 高达 20+ 秒;但 DNS、TCP、TLS 耗时均正常

公网

image

image

内网

image

image

image

关键结论

不是服务端性能问题(内网快)。
不是网络带宽/传输问题(DNS/TCP/TLS 正常)。
不是小程序本身问题(公网直接 curl 同样复现)。
大概率是 Nginx 反向代理 upstream 连接池与中间层 NAT/防火墙的「死连接」交互问题。

解决措施

一句话:专线换掉了那条「静默丢包」的公网路径,中间不再有人偷偷掐断你的 TCP 连接。


原理拆解

之前的问题本质

普通公网宽带(或云服务器公网入口)的数据包,中间会经过多层运营商网关、NAT 设备、防火墙、WAF/CDN 节点。这些设备为了节省资源,内部有一张会话表(Session Table):

TCP 连接空闲超过 X 分钟 → 会话表删除 → 后续数据包直接丢弃

而且它们是静默丢弃(不通知两端),导致 Nginx 还以为自己手里的连接能用,复用时触发TCP 超时重传(1s + 2s + 4s + 8s…),累积到 20 秒。

专线改变了什么

维度 普通公网宽带/互联网 企业专线(MPLS/SD-WAN/点对点)
NAT 层 经过运营商 NAT/CGNAT,会话表超时短(通常 5~15 分钟) 无 NAT 或固定路由,会话表保持极长甚至永久
中间网关 多层网关/防火墙,各自独立管理会话,任意一层掐断就完蛋 端到端专用通道,中间设备不干预连接状态
连接保活 TCP Keepalive 包可能被中间层过滤或无视 双向透传,Keepalive 能正常到达对端
路由稳定性 公网路由动态变化,可能绕不同节点 固定路由,路径不变,连接状态一致

核心差异:

专线相当于在你公司和服务器之间拉了一条虚拟的「直连网线」,中间没有第三方设备会因为你「几分钟没传数据」就把连接掐掉。


为什么换专线后冷连接问题消失了

[客户端] ←──────→ [公网 Nginx] ←──────→ [后端 192.168.3.66]
                     ↑
              普通宽带/云网关
              (会话表 5分钟超时,静默丢弃)
              
换专线后:

[客户端] ←──────→ [公网 Nginx] ←══════════→ [后端 192.168.3.66]
                     ↑
              专用通道(中间无会话表干扰)
              或防火墙会话超时调为 24h+

Nginx 的 upstream keepalive 连接池里的连接,** idle 很久也不会被中间层杀死**,下次复用时连接仍然是活的,所以:

  • 冷请求 = 直接复用活连接,毫秒级响应(和内网表现一致)
  • 不再出现 20 秒的超时重传惩罚

可能的附带因素

运维换专线时,通常还会顺带调整了以下配置,进一步解决问题:

  1. 防火墙会话超时调大:企业防火墙的 TCP 空闲超时从默认 300 秒改成 7200 秒或更长
  2. 去掉了某层反向代理:以前可能经过云厂商的共享网关/SLB,专线后直连或走专用出口
  3. 固定 IP 对固定 IP:专线两端 IP 固定,不再需要动态 NAT 映射,会话表不会过期

总结

问题现象 根因 专线如何解决
冷请求 20 秒 中间层 NAT/防火墙静默丢弃空闲连接,Nginx 复用死连接触发超时重传 消除中间层干扰,连接 idle 不被掐断,复用始终成功
内网正常 内网无 NAT 会话表,仅正常 TCP 握手开销(几十毫秒) 专线让公网也获得「类内网」的直连体验
静态资源快 静态资源不走 upstream 代理,不受连接池影响 专线后 API 也走稳定通道,全面改善

结论:专线本质上不是"变快了",而是"变稳定了"——它把那条会偷偷断开的公网路径,换成了一条端到端可控的专用通道,让 Nginx 的长连接复用机制终于能正常工作。

posted @ 2026-06-16 22:07  WinChance  阅读(44)  评论(0)    收藏  举报