nginx worker进程靠预设约束、协同调度和稳定驻留应对高负载,需合理设置worker数量、资源限制及缓冲区参数以保障稳定性与性能。

Nginx 的 worker 进程在高负载下不是靠“自动扩容”或“动态伸缩”来应对,而是靠预设约束 + 协同调度 + 稳定驻留来保持可控、可预期的处理能力。它不追求单个进程扛更多,而强调每个进程干得稳、不越界、不拖垮。
worker 进程数要匹配真实硬件能力,不是越多越好
每个 worker 是独立进程,共享只读代码段,但各自维护连接状态、缓冲区和缓存。过多 worker 会加剧 CPU 上下文切换、内存碎片和锁竞争(比如 accept_mutex)。
- CPU ≥ 16 核时,建议设为 8 或 12,而非盲目填满物理核数
- 使用
worker_processes auto可自动适配,但需配合worker_cpu_affinity auto或显式掩码绑定,避免跨 NUMA 节点访问内存 - 查看实际分配:运行
ps -eo pid,args,psr | grep 'nginx: worker',确认 PSR 列分散且合理
每个 worker 必须有明确的资源边界
没有上限的 worker 就像没刹车的车——流量一冲就内存暴涨或触发 OOM。关键控制项包括:
-
worker_rlimit_as 536870912(512MB 虚拟地址空间):内核级兜底,超限时返回 ENOMEM,Nginx 拒绝新连接而非崩溃 -
worker_rlimit_nofile 65535:与系统 ulimit -n 一致,防止打开文件数卡死 -
worker_connections 4096:按“单机峰值连接 × 1.2”估算,不堆到 65535;4K 连接约占用 12–16MB 内存(含 buffer)
连接与缓冲必须分层收紧,防放大、省内存
高负载下,攻击或异常请求极易通过 header/body 缓冲耗尽内存:
-
client_header_buffer_size 1k+large_client_header_buffers 2 2k→ header 总上限 4KB,够用且防构造攻击 -
client_body_buffer_size按业务上传上限设(如 16k),不传大文件就别留默认 128k -
proxy_buffers 8 4k+proxy_busy_buffers_size 8k:代理响应缓冲不冗余,避免 buffer 积压 -
open_file_cache max=2048 inactive=30s:文件句柄缓存及时释放,避免长期滞留
保持连接高效复用,减少系统开销
高并发 ≠ 高建连,短连接模式在百万级 QPS 下会让内核 socket 表、TIME_WAIT 和后端握手成为瓶颈:
- upstream 块启用
keepalive 200(连接池大小) - server 块强制
proxy_http_version 1.1+proxy_set_header Connection "" -
proxy_read_timeout设为略小于后端 keepalive timeout(如后端 60s,Nginx 设 55s),防止连接泄漏
不复杂但容易忽略。











