nginx优化tcp连接参数需按连接类型精准配置:客户端到nginx由keepalive_timeout控制,nginx到后端由upstream keepalive等控制;关键在upstream长连接池(keepalive 16–64)、分场景设超时、least_conn或consistent_hash负载均衡,并配合健康检查与监控。

Nginx 优化 TCP 连接参数,核心不是堆数值,而是让每个参数真正贴合后端行为、网络实际和连接生命周期。重点在 stream 模块(TCP/UDP 四层负载)或 http 模块(HTTP 长连接代理)中精准控制建连、保活、释放与感知能力。
明确 TCP 连接类型再调参
Nginx 处理的 TCP 连接分两类:
-
客户端到 Nginx 的连接(如 WebSocket、MySQL 客户端直连)→ 由
listen+keepalive_timeout控制 -
Nginx 到后端的连接(upstream 连接)→ 由
upstream keepalive、proxy_connect_timeout等控制
混用或错配会导致连接堆积、TIME_WAIT 暴增或会话中断。
精调 upstream 长连接池(关键)
这是减少后端连接压力最有效的手段:
- 在
upstream块中必须显式配置keepalive N;(N 建议设为 16–64,按单 worker 并发峰值的 1/3~1/2 估算) -
keepalive不是“最大连接数”,而是空闲连接复用池大小;超出部分仍会新建连接,但不会复用 - 配合
proxy_http_version 1.1;和proxy_set_header Connection "";(HTTP 场景),防止后端误关闭连接 - TCP 流场景(如 MySQL/Redis)则需
stream模块中启用proxy_timeout+tcp_nodelay on;
分场景设超时,避免“一刀切”
-
proxy_connect_timeout:只管三次握手阶段,内网设 1–3 秒,跨机房设 5–8 秒,超过 10 秒要查网络 -
proxy_timeout(stream)或proxy_read_timeout(http):必须略大于后端最长业务耗时(如 Redis 批量操作 240s → 设 300s),但上限建议 ≤ 600s -
keepalive_timeout(客户端侧):应小于后端服务的keepalive_timeout,例如 Tomcat 设 75s,Nginx 就设 60s
用 least_conn 或 consistent_hash 替代轮询
TCP 是长连接协议,轮询无法反映真实负载:
- 数据库、缓存类服务 → 用
least_conn;,按当前 ESTABLISHED 连接数分发,防止单节点堆积 - IM、WebSocket 等会话敏感服务 → 改用
hash $upstream_http_x_session_id consistent;(需客户端透传 token),比ip_hash更稳定 - 异构集群(新旧机器混合)→
least_conn;+server x.x.x.x:port weight=5;,兼顾均衡与能力差异
配合健康检查与监控闭环
- 主动检查
health_check interval=3s fails=2 passes=2;,并用match验证协议响应(如发送 PING 收 PONG) - 开启
log_format tcp_log "$remote_addr $upstream_addr $connection $upstream_connect_time";,用于分析连接倾向性 - 定期执行
ss -s | grep ESTAB和netstat -tn | awk '$NF~/ESTABLISHED/{print $5}' | cut -d: -f1 | sort | uniq -c,识别连接分布异常
不复杂但容易忽略











