nginx采用事件驱动异步模型,每个worker进程单线程、非阻塞,通过epoll/kqueue管理数万连接;apache则基于同步阻塞模型,每个线程独占请求直至完成,高并发时资源开销大。

Nginx 的多进程模型和 Apache 的线程模型本质不是同类设计,不能简单类比为“进程 vs 线程”的选择,而是事件驱动异步模型与同步阻塞模型的根本分野。
Nginx 的多进程是轻量级协作结构
Nginx 启动时有一个主进程(master)和若干工作进程(worker),但这些 worker 进程本身是单线程、非阻塞、事件驱动的:
- 每个 worker 进程不为每个连接创建新线程或进程,而是靠 epoll(Linux)或 kqueue(BSD)监听成千上万个连接的状态变化;
- 请求到来时,worker 不会停在读取、等待后端响应等环节,而是注册事件、立即返回处理其他请求;
- I/O 完成后由内核通知,worker 再回调处理——整个过程无阻塞、无上下文频繁切换;
- worker 数量通常设为 CPU 核心数,既避免锁竞争,又充分压榨硬件资源。
Apache 的线程模型依赖同步阻塞调度
Apache(尤其在 worker 或 event MPM 下)确实用线程,但其运行逻辑仍是同步的:
- 每个线程绑定一个请求,从接收、解析、执行 PHP/调用数据库,到生成响应,全程独占该线程;
- 若后端响应慢(如数据库查询卡住)、或客户端网络差(缓慢上传/Keep-Alive 等待),线程就挂起,无法复用;
- 即使启用 event MPM,它对长连接的优化有限,仍需保留部分线程用于阻塞操作(如 SSL 握手、某些模块调用),无法做到真正全异步。
关键差异不在“进程 or 线程”,而在“是否阻塞”
- Apache 的线程(或 prefork 的进程)是请求生命周期的容器:一个请求 → 一个执行单元 → 直到结束才释放;
- Nginx 的 worker 是事件调度器:一个 worker → 同时管理数万连接 → 每次只做最小单位的响应动作(如发 header、收 body 片段);
- 所以高并发下,Apache 可能启几百个线程,内存飙升、调度开销大;Nginx 几个 worker 就能稳住 10w+ 连接,CPU 和内存占用平缓。
不复杂但容易忽略。











