nginx多进程负载均衡依赖内核协作与合理配置实现近似均匀分布:worker_processes设为cpu物理核心数,启用accept_mutex防惊群,reuseport由内核哈希分发连接,ngx_accept_disabled动态避让高负载进程。

Nginx 的多进程架构本身不主动做“负载均衡调度”,它靠合理配置与内核协作,让多个 worker 进程自然、稳定地分担请求。关键不是让进程互相协调,而是避免争抢、减少空转、利用硬件能力,最终实现连接层面的近似均匀分布。
worker 进程数量要贴合 CPU 核心数
每个 worker 是独立进程,通常绑定一个 CPU 核心运行效率最高。设得太多(比如 16 个 worker 跑在 4 核机器上)会引发频繁上下文切换;设得太少(比如只开 1 个)又浪费多核资源。
- 推荐写法:
worker_processes auto; - 若需手动指定,应等于物理核心数(非超线程数),例如
worker_processes 4; - 配合
worker_cpu_affinity auto;(Linux)可自动绑定核心,进一步降低缓存抖动。
accept_mutex 控制连接争抢节奏
默认开启,作用是防止“惊群效应”——即所有 worker 同时被唤醒去 accept 同一个新连接,结果只有一个成功,其余空耗。
- 它让 worker 排队获取 accept 锁,拿到锁的才处理新连接,没拿到的专注处理已有连接的读写事件
- 不是算法式均衡,但它是公平分发的基础机制,建议保持
accept_mutex on;
reuseport 让内核直接分发连接
这是现代高并发部署的关键优化(Linux 3.9+ 支持)。启用后,每个 worker 可绑定同一端口的独立 socket,内核按四元组(源IP+源端口+目标IP+目标端口)哈希,直接把新连接派给某个 worker。
- 效果比 accept_mutex 更均衡,延迟更低,吞吐更高
- 配置只需一行:
reuseport on;(放在 events 块中) - 注意:需搭配
use epoll;和multi_accept on;才能发挥最佳效果
ngx_accept_disabled 实现动态避让
Nginx 内部会实时计算每个 worker 的连接压力:
- 当空闲连接数低于总量的 1/8(即已用连接 ≥ 7/8),该 worker 自动设置
ngx_accept_disabled > 0 - 此时它不再尝试抢 accept 锁,只处理已有连接,把新连接机会让给更空闲的进程
- 这是一种轻量级、无通信的被动均衡机制,无需额外配置,但依赖
worker_connections设置合理(如 1024 或更高)
不复杂但容易忽略











