必须显式配置upstream keepalive参数并强制协议与头部对齐,才能解决高并发下后端CPU飙升、TIME_WAIT堆积和延迟抬升问题;具体包括通过ConfigMap设置upstream-keepalive-connections、timeout、requests三参数,并补全proxy-http-version和Connection头清空逻辑。

在高并发场景下,Nginx-Ingress 默认不启用 upstream keepalive,导致每个请求都新建后端 TCP 连接,引发后端 CPU 飙升、TIME_WAIT 堆积和 P95 延迟明显抬升——必须显式配置连接池参数并确保协议与头部对齐,才能释放真实吞吐潜力。
确认 Ingress Controller 版本与配置入口
进入集群中 nginx-ingress-controller 的 Pod,执行 kubectl exec -it nginx-ingress-controller-xxxxx -- cat /etc/nginx/nginx.conf,搜索 upstream 区块,确认是否已自动生成 backend 定义;若未找到或无 keepalive 行,说明当前版本(如 v1.7.x 以下)未默认开启,需通过 ConfigMap 注入。
检查当前 ConfigMap:kubectl get cm -n ingress-nginx nginx-config -o yaml,重点看是否存在 upstream-keepalive-connections 字段。该字段是 nginx-ingress 官方支持的配置项,v1.0+ 版本起生效,无需修改模板或重编译。
通过 ConfigMap 启用并调优 upstream keepalive
方法一:直接编辑 ConfigMap 设置核心三参数
执行 kubectl edit cm nginx-config -n ingress-nginx,在 data 下添加或修改以下三项:
upstream-keepalive-connections: "32" —— 每个 worker 进程为每台后端缓存的空闲连接数;若后端单实例稳定承载 200 并发、Ingress 有 4 个 worker,则设为 【120】(200 × 0.6),避免连接池过小导致复用率低。
upstream-keepalive-timeout: "45" —— 空闲连接在池中保留秒数;必须 【比后端 idle timeout 小 5~10 秒】,例如 Tomcat 的 connectionTimeout=60s,此处必须 ≤50s,否则连接被后端主动断开后 Nginx 仍尝试复用,触发 502 错误。
upstream-keepalive-requests: "1000" —— 单个连接最多转发请求数;默认 100 太保守,API 场景建议 500~5000,设为 1000 可平衡连接新鲜度与复用深度。
保存后,Ingress Controller 会自动 reload nginx 配置,无需手动重启 Pod。
强制协议与头部对齐(关键补丁步骤)
仅改 ConfigMap 不够——Ingress 默认生成的 location 块中,proxy_http_version 和 Connection 头未强制覆盖,必须补上兜底配置。
在同个 ConfigMap 的 data 中追加:
proxy-http-version: "1.1"
proxy-set-headers: "ingress-nginx/custom-headers"
然后创建对应的自定义 headers ConfigMap:kubectl create cm custom-headers -n ingress-nginx --from-literal='Connection='。这一步清空了客户端传来的 Connection: close,防止 Nginx 误判并关闭连接。
若跳过此步,即使 upstream keepalive 已设,Nginx 仍可能以 HTTP/1.0 发请求,连接池形同虚设。
验证连接池是否真正生效
第一步:登录任一 nginx-ingress-controller Pod,执行:ss -tnp | grep :8080 | grep ESTAB | wc -l(将 8080 替换为你后端服务实际端口)。
观察输出值是否稳定在 worker 数 × 后端实例数 × upstream-keepalive-connections 的 0.7~1.2 倍区间;若持续攀升超 2 倍或剧烈波动,说明复用未建立。
第二步:发起压测,命令示例:hey -z 30s -c 200 http://your-domain/api/test,对比开启前后:
后端服务器的 netstat -an | grep :8080 | grep TIME_WAIT | wc -l 应下降 60% 以上;
Nginx Pod 内执行 curl localhost:10246/nginx-status(stub_status 端口),检查 Active connections 中 Writing 占比是否显著高于 Waiting;若 Waiting 长期 > Writing,说明空闲连接堆积,需缩短 upstream-keepalive-timeout。



















