Nginx 之所以能在高并发场景下(轻松处理数万甚至数十万的并发连接)表现得远超传统服务器(如 Apache),主要归功于其底层的架构设计。
它摒弃了“一个请求一个进程/线程”的模式,转而采用了 Reactor 模式。
1. 多进程模型 (Master-Worker Architecture)
Nginx 启动后,会产生一个 Master 进程 和多个 Worker 进程:
-
Master 进程:充当“指挥官”,负责读取配置、维护服务状态以及管理 Worker 进程。它不直接处理网络请求。
-
Worker 进程:充当“干活的”,负责处理实际的网络连接。通常 Worker 的数量会设置为与 CPU 核心数一致。
-
优势:由于 Worker 进程之间相互独立,即使一个进程崩溃,也不会影响其他进程,保证了高可用性。
2. 非阻塞、事件驱动 IO (Event-Driven)
这是 Nginx 高并发的核心黑科技。
-
传统方式 (阻塞 IO):服务器每接收一个请求,就得开一个线程去等。如果客户端动作慢(比如传文件),这个线程就得一直死等(阻塞),浪费大量内存和 CPU。
-
Nginx 方式 (非阻塞):Worker 进程采用“事件循环”机制。它会向内核询问:“有哪些连接有新动静了?”
-
如果有数据传过来,Worker 就去处理。
-
如果没有动静,Worker 立即去处理下一个连接。
-
结果:一个 Worker 进程就能同时维持成千上万个连接,而不需要频繁切换线程。
-
3. epoll 机制 (多路复用)
在 Linux 环境下,Nginx 使用了 epoll 技术(在 BSD 上是 kqueue)。
-
对比:早期的
select模式需要遍历所有的连接来寻找活跃请求(效率随连接数增加而剧降)。 -
epoll 的逻辑:内核会维护一个“就绪列表”。只有真正产生 IO 事件的连接才会通知 Nginx。
-
效率:即使你有 100 万个连接,只要其中只有 1000 个是活跃的,
epoll处理起来依然非常快。
4. 内存管理:内存池 (Memory Pool)
Nginx 极其抠门(为了性能)。为了避免频繁向系统申请和释放内存导致的碎片和开销,它设计了内存池:
-
它会预先申请一大块内存。
-
每个请求进来,从池子里分一点,请求结束,不立刻返还给系统,而是标记为可用或统一销毁。
-
这种空间换时间的做法极大减少了系统调用的频率。
总结:为什么 Nginx 这么快?
| 特性 | 带来的好处 |
| 单线程循环 | 避免了线程切换(Context Switch)的巨大 CPU 开销 |
| epoll 异步 IO | 实现了“一个核心处理万个请求”的能力 |
| 进程绑定 (Affinity) | 将 Worker 绑定到特定 CPU 核,缓存命中率更高 |
| 轻量化 | 模块化设计,只运行核心代码,内存占用极低 |
冷知识:Nginx 在作为反向代理时,不仅能分担压力,还能通过 Keep-alive 机制复用后端长连接,进一步减少 TCP 握手的开销。
你想了解一下 Nginx 的配置文件是怎么实现负载均衡(Load Balancing)的吗?或者想看看它在作为静态资源服务器时有哪些优化手段?