Nginx多进程结构通过主从分工、进程独立性与连接绑定实现故障隔离:master仅调度不处理请求,worker间内存隔离且连接独占处理,配合systemd可增强进程级防护。

Nginx 的多进程结构天然支持故障隔离,关键不在于“怎么开启多进程”,而在于理解并用好它的主从分工、进程独立性与连接绑定机制。只要配置得当,单个 worker 崩溃不会中断服务,也不会拖垮其他请求。
主进程只管调度,不碰请求
master 进程不处理任何网络请求,只做四件事:读配置、拉起 worker、响应信号(如 reload/stop)、监控 worker 状态。它本身极轻量,几乎不会因业务逻辑出错崩溃。即使某个 worker 因段错误或内存泄漏退出,master 会立刻 fork 一个新进程补位,其他 worker 完全不受影响。
每个 worker 独立运行,互不共享内存
默认情况下,worker 进程之间没有共享堆内存。每个进程拥有自己的连接表、缓冲区、计时器和 Lua 全局变量副本。这意味着:
- 一个 worker 卡死或崩溃,不会污染其他 worker 的连接状态
- 无需锁机制协调并发访问,避免死锁和竞争风险
- 可安全设置 worker_processes auto,让每个 CPU 核心跑一个 worker,既提升并行度,又保持故障隔离粒度
连接一旦分配,全程由单个 worker 处理
新连接通过 accept_mutex(或内核级 SO_REUSEPORT)分发给某个 worker,之后的读、解析、转发、写回全部由该 worker 独立完成,不跨进程传递 socket。因此:
- 某请求触发阻塞操作(如未设超时的 upstream 调用),只拖慢本 worker,其余 worker 照常接收新请求
- 配合 worker_connections 合理限制单进程并发数,能防止异常流量集中压垮某个 worker
- 避免在 init_worker_by_lua 中创建非线程安全的跨 worker 共享对象(如普通 Lua 表),否则会破坏隔离性
配合 systemd 实现进程级兜底防护
仅靠 Nginx 自身还不够。建议用 systemd 对 master 进程做资源约束与自动恢复:
- 用 MemoryMax=512M、CPUQuota=50% 防止失控消耗系统资源
- 设置 Restart=always 和 RestartSec=5,确保 master 意外退出后秒级自愈
- 启用 Delegate=yes 和 MemoryAccounting=yes,让 cgroup v2 对 worker 子进程也生效


















