keepalive_timeout通过复用tcp连接摊薄固定协议开销来省带宽:低带宽下每次建连需额外传输syn/syn-ack/ack(120–180字节)及http头(300–600字节),设为15–30秒可使多请求共享连接,避免重复传输;须配合keepalive_requests、upstream keepalive、http/1.1及精简header才生效。

keepalive_timeout 本身不直接压缩数据,但它能显著降低带宽消耗——关键在于减少重复传输的协议开销。
为什么能省带宽?
在低带宽链路(如 2G、弱 WiFi、卫星通信)中,真正挤占带宽的往往不是业务数据本身,而是每次新建 TCP 连接和 HTTP 请求带来的固定字节开销:
- TCP 三次握手:至少 3 个包,含 SYN/SYN-ACK/ACK,约 120–180 字节
- HTTP 请求头(Host、User-Agent、Cookie、Accept 等):常见小 API 请求头达 300–600 字节
- 四次挥手断连:额外 4 个包,进一步占用信道
这些头部和控制包是“固定成本”,与响应体大小无关。频繁建连会让它们反复出现,白白吃掉本就紧张的带宽资源。
keepalive_timeout 如何起作用?
它控制 Nginx 与客户端之间空闲连接保持多久。设为合理值(如 15–30 秒),能让多个请求复用同一个 TCP 连接,从而摊薄上述固定开销:
- 第一个请求:完整握手 + 完整请求头 + 响应
- 后续请求(15 秒内):零握手 + 精简请求头(部分 header 可复用或省略)+ 响应
实测中,单连接处理 10 次小请求,可比 10 个短连接节省 40% 以上的有效载荷外传输量。
必须配合的关键配置
单独调大 keepalive_timeout 效果有限,需同步启用以下机制才能真正降低带宽压力:
- keepalive_requests 50–100:防止单连接被异常客户端长期占用,确保连接槽位高效轮转
- upstream keepalive 32:后端连接也要复用,否则前端省下的带宽,会在 Nginx 到后端链路上重新浪费
- proxy_http_version 1.1 和 proxy_set_header Connection '':强制使用 HTTP/1.1 并清除可能触发关闭的 Connection 头
- 精简转发头:禁用不必要的 header(如 X-Powered-By),用 proxy_set_header 显式控制转发字段
验证是否真省了带宽
不要只看配置,要观测实际网络行为:
- 用
tcpdump -i any port 443 -c 100抓包,对比开启前后 SYN 包密度;复用良好时,SYN 出现频率应明显下降 - 检查 Nginx access log 中
$connection_requests字段:平均值 ≥ 5 表示复用已生效;若大量为 1,说明连接仍频繁重建 - 监控
ss -tn state established | wc -l:连接数波动变平缓,说明空闲堆积减少、复用更稳定











