正确写法是worker_processes auto;,Nginx启动时调用sysconf(_SC_NPROCESSORS_ONLN)获取系统在线逻辑CPU数作为进程数,不识别cgroup限制或超线程状态。

直接在 Nginx 主配置文件(通常是 /etc/nginx/nginx.conf)的最外层(即 main 块)中写入:
正确写法:用 auto 作值,不是新指令
worker_processes 的合法语法只有 worker_processes number; 或 worker_processes auto;。不存在 worker_processes_auto 这个配置项——这是常见误写。
- ✅ 正确:
worker_processes auto; - ❌ 错误:
worker_processes_auto on;或worker_processes = auto;
它怎么自动获取核心数?
Nginx 启动时调用系统接口 sysconf(_SC_NPROCESSORS_ONLN),读取当前操作系统报告的在线逻辑 CPU 数(即 nproc 命令输出的值),并以此作为 worker 进程数量。
- 它不看 cgroup 限制(容器里设了 2 核,宿主机有 32 核,仍会启 32 个)
- 它不区分超线程是否启用,只认系统“可见”的逻辑核
- 在 OpenVZ 等旧虚拟化环境可能返回 1,上线前建议验证
容器或云环境需配合调整
auto 虽方便,但在资源受限场景下容易失准:
- Docker/K8s 中设置了
resources.limits.cpu: "2"→ 应显式写worker_processes 2; - 若必须用 auto,建议搭配
worker_cpu_affinity auto;(Nginx ≥1.12.0),减少跨核调度开销 - 混合部署(如 Nginx + Java 共存)可预留核心:
worker_processes $(nproc --all | awk '{print $1-2}');(需启动脚本支持)
配置后如何确认生效?
不要只信配置文件,要验证运行态:
- 查错误日志:
tail -f /var/log/nginx/error.log,启动时会打印using X processes - 看进程数:
ps -C nginx --no-headers | wc -l(结果应等于 worker_processes 值) - 查加载配置:
nginx -T 2>/dev/null | grep 'worker_processes'











