单核虚拟机下worker_processes最优解必须设为1,因单核无法并行执行多worker进程,设为大于1将引发频繁上下文切换、accept_mutex锁竞争及资源平摊;需配套设worker_connections 8192、worker_rlimit_nofile 10000、use epoll和multi_accept on,并禁用auto以防误读核数。

单核虚拟机下,worker_processes 最优解就是设为 1,且需配套调整连接与资源限制,而非强行模仿多核配置。
为什么必须是 1?
单核 CPU 无法真正并行执行多个重量级 worker 进程。设为大于 1(如 2 或 4)会导致:
- 频繁进程上下文切换,CPU 时间大量消耗在调度而非处理请求上
- worker 间争抢监听套接字,触发 accept_mutex 锁竞争,反而降低吞吐
- 内存与文件描述符被冗余进程平摊,单个 worker 可用资源反而减少
配套关键参数必须同步优化
仅设 worker_processes 1 不够,需确保单个 worker 能扛住并发压力:
-
worker_connections 8192;—— 单进程连接上限提至 8K 级别(默认仅 512),配合系统 ulimit -n ≥ 10000 -
worker_rlimit_nofile 10000;—— 在 nginx.conf 中显式声明,避免启动时因句柄不足失败 -
use epoll;—— Linux 下强制启用高效事件模型,不依赖自动探测 -
multi_accept on;—— 让单个 worker 尽可能一次收完就绪连接,减少唤醒次数
特别注意容器/云虚拟机的陷阱
某些单核虚拟机(如部分 OpenVZ、低配 AWS t3.micro)会向 nginx 暴露错误的逻辑核数。即使 nproc 返回 1,也建议显式写死:
- 不要用
worker_processes auto;—— 它可能误读为 2 或更多 - 直接写
worker_processes 1;,杜绝自动探测偏差 - 检查
/sys/fs/cgroup/cpu/cpu.cfs_quota_us和cpu.cfs_period_us,确认是否真被限制为 1 核配额
验证是否真正生效
改完后执行两步:
-
nginx -t确认语法无误 -
nginx -s reload平滑重载(勿 kill -9) - 运行
ps aux | grep nginx,应只看到 1 个 worker 进程(除 master 外) - 用
ab -n 10000 -c 1000 http://your.site/压测,观察 CPU idle 是否稳定在 20% 以上、无持续 100% 占用


















