Nginx目前是大型架构的必备中间件,之所以广泛被使用的关键点,就是Nginx的并发能力更强@mikechen
Nginx 如何处理高并发请求
Nginx 作为一个高性能 Web 服务器和反向代理服务器,最著名的特性之一就是它强大的并发处理能力。
在高并发访问场景下,Nginx 能以极低的资源消耗,处理成千上万的连接,这得益于其高效的并发模型设计。
Nginx 的设计理念是少量进程处理海量请求,它通过内核级事件通知机制(如 epoll/kqueue)监听所有连接事件。
在单线程内完成多个连接的读写处理,从而极大减少了线程切换、内存开销和上下文切换带来的性能损失。
核心思路:
- 不为每个连接分配独立线程,而是统一监听、调度和管理。
- 所有连接都是非阻塞的,避免“慢请求”拖累服务器性能。
- 精细化事件管理,实现高效 IO 复用。
Nginx并发模型原理
Master-Worker 进程模型
Nginx 启动时,会启动一个 Master 主进程和若干个 Worker 工作进程。
Master 进程的功能:
- 读取并解析配置文件
- 管理 Worker 子进程(启动、重启、关闭)
- 响应外部信号(如 reload、stop)
- 不处理实际的 HTTP 请求
Worker 进程的职责:
- 每个 Worker 独立运行,互不干扰
- 每个 Worker 是单线程,负责处理客户端所有网络请求
- Worker 进程内部通过高效的事件循环机制处理多个连接
通常会配置多个 Worker 进程,与 CPU 核心数相等,从而实现最大化并发利用率。
一个请求从客户端到 Nginx 的完整处理流程如下:
客户端发起连接 ↓ Master 监听 socket,accept 到新连接 ↓ 将连接交给某个空闲 Worker(通过 accept_mutex 互斥避免惊群) ↓ Worker 将连接设置为非阻塞并添加到事件循环中 ↓ 事件触发:读取请求 → 处理请求 → 发送响应 ↓ 连接关闭或进入 keepalive 等待下次请求
事件驱动机制
Nginx 并非为每个连接创建线程,而是采用事件驱动(event-driven)+ 非阻塞 IO的方式。
每个 Worker 进程维护一个事件循环,不断从操作系统获取就绪事件,然后依次处理:
1. 接收连接 → 2. 读取请求 → 3. 处理业务逻辑 → 4. 发送响应
事件循环示意图如下:
while (true) {
events = epoll_wait(); // 阻塞等待事件发生
for (event in events) {
handle(event); // 处理连接、读写、关闭等事件
}
}
异步非阻塞 I/O
在传统阻塞模型中,一个请求的处理(比如读取请求体、访问后端服务)会阻塞线程,影响并发。
Nginx 采用非阻塞 IO,每个操作都不会卡住线程:
- 调用
recv()
时,如果无数据立即返回EAGAIN
,继续处理其他事件; - 等待操作系统通知再回来继续处理该连接;
- 同样方式处理写操作,避免任何慢连接阻塞主逻辑。
Epoll等高效事件处理模型
Nginx 在 Linux 下使用 epoll
,在 BSD/macOS 使用 kqueue
,它们属于操作系统级别的高效 I/O 多路复用机制:
epoll
支持边缘触发(edge-triggered)模式,可减少重复事件通知;- 可以同时监听大量 socket 文件描述符;
- 不需要在每次循环中遍历所有连接,提高大并发下的性能表现;
这相比传统的 select/poll
,在连接数成千上万时性能优势巨大。
总之,Nginx 的并发模型通过 Master-Worker 进程模型。实现了架构上的清晰和稳定,通过事件驱动机制和异步非阻塞 I/O 实现了单个 Worker 进程的高效并发处理能力。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》