Nginx 高并发稳定需“快接、稳分、不堵、可退”:调优内核参数与 listen backlog、合理选调度算法、复用连接并设对齐超时、限流缓冲与降级。

要让 Nginx 稳定扛住大规模流量,关键不在“多接”,而在“快接、稳分、不堵、可退”。连接调度不是单点调参,而是从内核到 Nginx 配置再到后端协同的一整套链路优化。
连接接入层:先让请求进得来
大量连接卡在第一步——TCP 建立阶段。若系统或 Nginx 无法及时收下已完成三次握手的连接,就会丢包、超时、客户端重试,反而加剧拥塞:
- 调高内核参数:
net.core.somaxconn和net.ipv4.tcp_max_syn_backlog均建议设为 65535,避免默认值(常为 128)成为瓶颈 - Nginx
listen指令必须显式带backlog=65535,例如listen 80 backlog=65535;,否则用默认 511,调了也白调 - 每个 worker 进程能打开的文件数要匹配:设
worker_rlimit_nofile 1048576;,并确保系统级ulimit -n≥ 同值 - 启用
epoll+multi_accept on+accept_mutex off,让多个 worker 并行 accept,减少争抢
请求分发层:按场景选对算法
没有通用最优算法,调度策略必须贴合业务连接特征:
-
短连接洪峰(如秒杀、抢券):用
least_conn,新请求总发给当前活跃连接最少的后端,防止单点瞬间打满 -
长连接/会话型流量(如 WebSocket、登录态 API):用
ip_hash或hash $binary_remote_addr,保证用户粘性;搭配健康检查自动剔除异常节点 -
异构后端(新老机器混布):加
weight参数做加权轮询,例如新机器weight=5,旧机器weight=2 - 需运行中切换?定义多个
upstream块(如backend_least、backend_hash),再用map指令根据请求头或 cookie 动态路由,秒级生效
连接生命周期管理:避免积压与泄漏
后端响应慢会导致连接堆积在 Nginx,最终耗尽 worker 资源:
- upstream 中启用连接复用:
keepalive 200;(推荐 100–300),配合keepalive_requests 1000; - 透传 HTTP/1.1 长连接:
proxy_http_version 1.1;+proxy_set_header Connection ""; - 超时设置需对齐:Nginx 的
proxy_read_timeout应略小于后端 keepalive timeout(如后端设 60s,Nginx 设 55s),防止连接挂死 - 关闭非必要 header 缓冲:
client_header_buffer_size 1k;+large_client_header_buffers 2 2k;,防恶意头部耗尽内存
缓冲与降级:给突发留出安全余量
真正的稳定性来自“不全打穿”——让部分压力在边缘缓冲或降级掉:
- 限流排队:用
limit_req_zone $binary_remote_addr zone=burst:10m rate=100r/s;+limit_req zone=burst burst=50 nodelay;,允许短时溢出但不阻塞 worker - 静态资源启用
open_file_cache,降低磁盘 I/O;只读接口开启proxy_cache,减少后端穿透 - 上传类大请求启用落盘:
client_body_in_file_only clean;,避免 body 占用 worker 内存 - 紧急时可临时标记后端
down,或调高max_fails容忍阈值,延缓故障判定


















