核心是“单机压得稳”与“集群分得匀”协同:通过cpu亲和、epoll+multi_accept、合理keepalive及上游连接池等配置,提升单机并发承载力并优化集群流量分发。

解决 Nginx 在高可用场景下的高并发连接数瓶颈,核心不是堆机器或盲目调大参数,而是让每个连接更轻、复用更久、调度更准、资源不争抢。重点在“单机压得稳”和“集群分得匀”两个层面协同发力。
单机连接能力挖潜
高可用架构下,每台 Nginx 节点都必须扛住局部高峰,否则故障切换时容易雪崩。
-
worker 进程与 CPU 绑定要对齐:设
worker_processes auto,再配合worker_cpu_affinity auto(Linux 4.0+)或显式绑定(如 8 核配00000001 00000010 ...),避免进程跨核调度带来的缓存失效 -
连接数不是越大越好,而要匹配系统上限:先执行
ulimit -n查看文件描述符限制;设worker_rlimit_nofile 100000,再设worker_connections 20000(4 核即支持 8 万并发),确保worker_rlimit_nofile ≥ worker_processes × worker_connections × 1.2 -
用 epoll + multi_accept 提前吞连接:在
events块中启用use epoll和multi_accept on,让单次事件通知能批量接受多个新连接,降低 accept 队列溢出风险
连接生命周期精细化控制
大量短连接会快速耗尽端口、触发 TIME_WAIT 拥堵,也加重后端压力。
-
keepalive 要“够用但不贪”:API 网关类场景设
keepalive_timeout 65s、keepalive_requests 1000;静态资源可延长至 300s。避免设成 1200s 以上,否则空闲连接长期占位 -
客户端超时必须收紧:
client_header_timeout 15s、client_body_timeout 15s、send_timeout 10s,防止慢速攻击或异常客户端拖垮 worker -
主动清理无效连接:配合内核参数
net.ipv4.tcp_tw_reuse = 1(需net.ipv4.tcp_timestamps = 1),让 TIME_WAIT 连接可被重用,缓解端口耗尽
上游连接池与后端协同优化
高可用常搭配多台后端(如 Tomcat、Go 服务),上游连接管理不当会放大瓶颈。
-
upstream keepalive 要开启且合理:在
upstream块中配置keepalive 300(长连接池大小)、keepalive_requests 10000、keepalive_timeout 60s,避免每请求都重建后端 TCP 连接 -
健康检查不能太激进:设
max_fails=3 fail_timeout=30s,避免瞬时抖动误判宕机;用health_check interval=5 fails=2 passes=2(需 stream 模块)提升探测精度 -
负载策略按流量特征选:接口类用
least_conn或带权重的ip_hash;静态资源用默认轮询即可,避免 hash 分布不均导致单节点过载
可观测性与弹性兜底
高可用场景下,看不见的瓶颈比配置错误更危险。
-
用
ss -s和netstat -an | grep :80 | awk '{print $6}' | sort | uniq -c实时看连接状态分布:ESTABLISHED 应 >85%,TIME_WAIT -
暴露 Nginx stub_status 或集成 Prometheus metrics:重点关注
Active connections、Reading/Writing/Waiting三态比例,Waiting 长期高于 70% 说明响应慢或后端卡顿 -
前置限流保命:用
limit_conn控制 IP 或 zone 级别并发,或limit_req控制 QPS,防止突发流量打穿整个集群











