必须分层配置内核参数、nginx upstream长连接和客户端连接超时三类设置,缺一不可;其中upstream块内keepalive指令是后端复用核心,需配合proxy_http_version 1.1和proxy_set_header connection ""生效,且nginx版本不低于1.15.3。

要让Web服务器在高并发下稳定复用TCP连接、避免TIME_WAIT堆积和QPS瓶颈,必须分层配置内核参数、Nginx upstream长连接、客户端连接超时三类设置,漏掉任意一层都会导致KeepAlive失效。
配置Nginx upstream长连接
这一步是后端连接复用的核心,只配keepalive指令不生效,必须三者齐备。
第一步:在http块顶层定义upstream,不能嵌套在server或location里:
upstream backend {
server 10.0.1.5:8000;
keepalive 32;
}
第二步:在对应的location块中添加两行关键代理指令:
proxy_http_version 1.1;
proxy_set_header Connection "";
第三步:确认Nginx版本≥1.15.3——低于该版本时keepalive_timeout和keepalive_requests对upstream无效,且启动时若把keepalive写错位置会直接报unknown directive错误。【keepalive必须且只能出现在upstream块内】
调优Nginx客户端连接参数
这部分控制浏览器→Nginx这段连接的复用行为,和upstream无关,但影响前端体验与资源占用。
在server或http块中加入:
keepalive_timeout 45s 45s;
keepalive_requests 500;
第一个45s是Nginx等待下一个请求的空闲时间,第二个45s会写入响应头Keep-Alive: timeout=45;500表示单连接最多处理500次请求,防止单连接长期霸占worker进程。设太高容易积累僵尸连接,设太低会导致频繁重连。
调整Linux内核TCP参数
内核层不配合,上层再怎么配也会被系统强制回收连接。
方法一:缩短空闲连接探测周期
echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes
echo 3 > /proc/sys/net/ipv4/tcp_keepalive_intvl
方法二:扩大临时端口范围并提升文件描述符上限
sysctl -w net.ipv4.ip_local_port_range="32768 65535"
echo "* soft nofile 65536" >> /etc/security/limits.conf
注意:tcp_fin_timeout不能手动调低到60秒以下,否则违反RFC规范,可能引发连接重置问题。
验证连接复用是否生效
执行命令观察当前活跃连接数与TIME_WAIT数量变化:
ss -s | grep -E "(established|time-wait)"
再用curl发起连续请求并检查响应头:
curl -I http://your-domain.com | grep "Connection\|Keep-Alive"
若返回Connection: keep-alive且Keep-Alive头中包含timeout字段,说明客户端连接已启用;再登录后端服务器运行netstat -ant | grep :8000 | wc -l,对比并发请求数与实际TCP连接数,若后者显著小于前者,证明upstream长连接已生效。











