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


内网



关键结论
不是服务端性能问题(内网快)。
不是网络带宽/传输问题(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 秒的超时重传惩罚
可能的附带因素
运维换专线时,通常还会顺带调整了以下配置,进一步解决问题:
- 防火墙会话超时调大:企业防火墙的 TCP 空闲超时从默认 300 秒改成 7200 秒或更长
- 去掉了某层反向代理:以前可能经过云厂商的共享网关/SLB,专线后直连或走专用出口
- 固定 IP 对固定 IP:专线两端 IP 固定,不再需要动态 NAT 映射,会话表不会过期
总结
| 问题现象 | 根因 | 专线如何解决 |
|---|---|---|
| 冷请求 20 秒 | 中间层 NAT/防火墙静默丢弃空闲连接,Nginx 复用死连接触发超时重传 | 消除中间层干扰,连接 idle 不被掐断,复用始终成功 |
| 内网正常 | 内网无 NAT 会话表,仅正常 TCP 握手开销(几十毫秒) | 专线让公网也获得「类内网」的直连体验 |
| 静态资源快 | 静态资源不走 upstream 代理,不受连接池影响 | 专线后 API 也走稳定通道,全面改善 |
结论:专线本质上不是"变快了",而是"变稳定了"——它把那条会偷偷断开的公网路径,换成了一条端到端可控的专用通道,让 Nginx 的长连接复用机制终于能正常工作。

浙公网安备 33010602011771号