nginx高性能源于架构设计的“省”:采用master-worker多进程模型实现稳与分的平衡,每个worker以单线程事件循环+epoll/kqueue异步非阻塞i/o并发处理万级连接,模块通过钩子注册接入生命周期,解耦可扩展。

Nginx 的高性能不是靠堆资源换来的,而是靠架构设计“省”出来的:用多进程隔离风险,用单线程事件循环榨干每个 CPU 核心的效率。
Master-Worker 多进程模型:稳与分的平衡
启动后,Nginx 只有一个 master 进程和多个 worker 进程。master 不处理请求,只做三件事:读配置、启停 worker、平滑重载。真正干活的是 worker —— 每个 worker 独立监听端口、接收连接、处理请求。
- worker 数量通常设为 CPU 核心数,让 OS 能把不同 worker 调度到不同核心上,避免争抢
- worker 之间不共享内存(除极少量统计用的共享内存),天然无锁,不会因同步拖慢速度
- 某个 worker 崩溃,master 会拉起新进程补位,其他 worker 照常工作,服务不中断
单线程事件循环:一个 worker 并发万连接的秘密
每个 worker 内部是单线程 + 事件驱动,靠操作系统提供的高效 I/O 多路复用机制(Linux 下是 epoll)同时监控成千上万个 socket。
- socket 准备好读/写时,epoll 才通知 worker,而不是轮询或死等 —— 避免阻塞
- worker 收到通知后立即处理,处理完马上检查下一个就绪事件,全程不挂起
- 没有线程创建/切换开销,也不需要为每个连接分配栈空间(省下大量内存)
异步非阻塞:对 I/O 的重新定义
“异步”指发起读写操作后不等结果,继续处理别的事;“非阻塞”指系统调用(如 read/write)立刻返回,哪怕数据还没准备好或没写完。
- 网络 I/O 全部走这套机制,所以 worker 能在等待磁盘或上游响应时,去服务其他客户端
- 真正耗时的阻塞操作(比如读取大文件)从 Nginx 1.9.0 开始交给线程池处理:worker 把任务丢进队列,后台线程执行,完成后发信号唤醒 worker
- 主线程始终专注事件调度,I/O 密集型任务不卡主线程
模块化与生命周期:可扩展性的根基
Nginx 功能靠模块拼装,每个模块通过注册 hook 点介入请求生命周期(如 postconfiguration、init_process、exit_thread),不影响主循环结构。
- 核心模块管进程、事件、配置;HTTP 模块处理协议逻辑;过滤模块改响应(如 gzip);处理模块实现功能(如 proxy、rewrite)
- 第三方模块(如 lua-nginx-module)也能无缝接入,因为所有模块都遵循同一套事件驱动范式
- 模块初始化、进程级准备、线程级设置各司其职,既解耦又可控











