nginx万级并发需三层协同优化:内核资源(10项)、worker调度(8项)、http/tcp传输(12项),共30个关键参数环环相扣,缺一不可。

想让 Nginx 负载均衡真正扛住万级并发、低延迟转发,光配 upstream 和 weight 远远不够。关键在三层协同:Linux 内核资源底座、Nginx 进程与事件调度层、HTTP 传输与连接控制层。30 个参数不是堆砌,而是环环相扣的链路优化。
系统内核与资源限制(10项)
这是所有高并发的底层前提,没调好,Nginx 再怎么配都卡在系统瓶颈上:
-
/etc/security/limits.conf 中为 nginx 用户设硬软限制:
nginx soft nofile 1048576、nginx hard nofile 1048576 - net.core.somaxconn = 65535:提升全连接队列深度,避免 accept 队列溢出丢包
- net.core.netdev_max_backlog = 262144:网卡收包队列,防突发流量丢帧
-
net.ipv4.tcp_max_syn_backlog = 65535:SYN 半连接队列,配合
tcp_syncookies = 1抗 SYN Flood - net.ipv4.tcp_tw_reuse = 1:允许 TIME_WAIT 套接字复用于新连接(客户端地址+端口可重用)
- net.ipv4.tcp_fin_timeout = 30:缩短 FIN_WAIT_2 状态超时,加快连接回收
- net.ipv4.ip_local_port_range = "1024 65535":扩大本地端口范围,缓解反向代理端口耗尽
- vm.swappiness = 10:降低内存换出倾向,保障 worker 进程响应稳定性
- fs.file-max = 2097152:系统级最大文件句柄数,需 ≥ nginx 总连接理论值
- net.ipv4.tcp_congestion_control = bbr:启用 BBR 拥塞控制算法,提升弱网吞吐与低延迟
Nginx 主进程与 Worker 调度(8项)
让每个 CPU 核心专注服务一个 worker,消除缓存抖动和上下文切换开销:
- worker_processes auto:自动匹配物理 CPU 核心数(非超线程数),避免进程争抢
- worker_cpu_affinity auto:内核 4.0+ 支持,比手动掩码更安全可靠
-
worker_rlimit_nofile 1048576:必须 ≥
worker_connections × worker_processes,否则无效 - worker_priority -10:提升调度优先级,在混合部署中抢占更及时的 CPU 时间片
- events { use epoll; }:Linux 必选,epoll 是唯一支持百万级连接的高效模型
- worker_connections 65535:单 worker 并发上限,静态服务可设高,反代场景建议 ≤32768
-
multi_accept on:一次 accept 多个就绪连接,配合 high
worker_connections提升吞吐 - accept_mutex off:关闭惊群锁(Nginx 1.11.3+ 默认关闭),让所有 worker 竞争新连接
HTTP 与 TCP 传输层精细控制(12项)
从连接建立、头部分发、数据拷贝到超时释放,每一步都影响毫秒级体验:
- keepalive_timeout 60s:API 反代建议 30s,静态资源可设 75s;过长易积压空闲连接
- keepalive_requests 10000:单连接最大请求数,防长连接被恶意占满
- tcp_nodelay on:禁用 Nagle 算法,确保小包(如 HTTP 头、JSON 响应)立即发出
-
tcp_nopush on:配合
sendfile on启用 TCP_CORK,实现满包发送 + 零拷贝 - sendfile on:绕过用户态,直接由内核完成文件到 socket 的数据搬运
- sendfile_max_chunk 512k:限制单次 sendfile 最大数据量,防大文件阻塞事件循环
- client_header_buffer_size 4k:防止常规请求头触发磁盘临时文件读写
- large_client_header_buffers 8 8k:应对含大量 Cookie 或自定义 Header 的请求
- reset_timedout_connection on:主动重置超时连接,快速释放资源
- proxy_buffering on:开启上游响应缓冲,避免后端慢导致 worker 长期阻塞
- proxy_buffer_size 128k:首块缓冲区大小,需 ≥ 后端返回的最大响应头
-
proxy_busy_buffers_size 256k:忙时可用缓冲区总和,应为
proxy_buffer_size的 2 倍左右











