Nginx采用事件驱动的多进程架构,内存占用低、并发能力强,适合I/O密集型场景;Apache prefork为进程隔离模型,内存随并发线性增长,适合需强进程隔离的传统PHP部署。

Nginx 的多进程架构和 Apache 的预派生(prefork)模式都面向高并发场景,但设计哲学和性能表现差异显著——关键不在“谁更快”,而在于“谁更适合你的负载特征”。
核心模型差异:事件驱动 vs 进程隔离
Nginx 采用主进程 + 固定数量工作进程(worker process)的结构,每个 worker 是单线程、非阻塞、基于 epoll/kqueue 的事件循环。它不为每个连接创建新进程或线程,而是复用少量 worker 处理成千上万并发连接。
Apache prefork 模式则为每个请求 fork 一个独立子进程,每个子进程只处理一个连接(同步阻塞)。进程数由 StartServers、MinSpareServers、MaxSpareServers 和 MaxRequestWorkers 控制,内存开销随并发线性增长。
内存与并发能力对比
相同硬件下,Nginx 的内存占用稳定且低:1 个主进程 + N 个 worker(如 4 个),每个 worker 默认可支撑数万连接;而 prefork Apache 在 1000 并发时往往需维持 1000+ 子进程,每个进程常驻 5–15 MB 内存,极易触发 OOM。
- Nginx 更适合长连接、大量静态资源、API 网关等 I/O 密集型场景
- Prefork Apache 在运行传统 PHP(mod_php)且无 OPcache 优化时,因进程内嵌解释器,对简单动态脚本有更确定的隔离性
- 若启用 PHP-FPM + Nginx,既能获得事件模型优势,又能复用 prefork 的进程级安全边界
CPU 利用与扩展性瓶颈
Nginx worker 数量通常设为 CPU 核心数(或略高),避免上下文切换开销;所有 worker 均绑定到不同 CPU,天然支持多核并行。
Prefork 模式下,进程调度由内核完成,高并发时频繁 fork/exit 和信号处理(如 graceful restart)会显著抬升系统态 CPU 使用率;且无法像 Nginx 那样精细控制连接生命周期(如 keepalive 超时、request body 缓冲策略)。
- 超过 2000 并发时,prefork Apache 的响应延迟波动明显增大
- Nginx 在 5w+ 连接下仍能保持 sub-10ms 的平均延迟(静态内容)
- 两者在 SSL 终止场景下性能差距收窄,但 Nginx 的 OCSP stapling 和 session reuse 支持更成熟
运维与调优关键点
真实压测中,性能差异常被配置掩盖。例如:
- Nginx 若未设置 worker_connections 或 events.use,可能退化为 select 模式
- Prefork Apache 若 MaxRequestWorkers 过低,会直接拒绝新连接(返回 503),而非排队等待
- 两者都需配合系统级优化:ulimit -n 提升文件描述符、net.core.somaxconn 调整连接队列、关闭 TCP Delayed ACK
不复杂但容易忽略。











