1、简述
Nginx 之所以能够成为高性能的 Web 服务器、反向代理和负载均衡器,核心原因之一就是其 事件驱动模型。
与传统的“每连接一个线程/进程”的模式不同,Nginx 使用 异步非阻塞 I/O + 多路复用,能够在少量进程下处理成千上万的并发连接。
2、传统并发模型回顾
进程/线程 per connection
🔹 每个连接分配一个独立进程或线程。
🔹 缺点:高并发下上下文切换成本高,内存消耗大。
事件驱动模型
🔹 所有连接由少量 worker 进程统一管理。
🔹 使用 I/O 多路复用(如 epoll/kqueue/select)监听所有事件。
🔹 事件触发时,回调业务逻辑。
🔹 优点:高并发下性能更优,资源占用小。
3、事件驱动架构
Nginx 的架构分为 master 进程 和 worker 进程:
master 进程:
🔹 负责管理 worker,监控配置文件变化。
🔹 不参与业务请求处理。
worker 进程:
🔹 每个 worker 是单线程,但基于 事件驱动 + 异步非阻塞 I/O。
🔹 使用 epoll(Linux)/kqueue(BSD) 等事件通知机制。
🔹 每个 worker 处理多个客户端连接。
👉 关键点:一个 worker 可以同时处理上万连接,而不需要上万线程。
事件循环机制(Event Loop)
🔹 事件注册:worker 通过 epoll_ctl
注册感兴趣的事件(如读、写)。
🔹 事件监听:调用 epoll_wait
等方法阻塞等待事件。
🔹 事件分发:当有事件发生,事件循环唤醒,找到对应的回调处理函数。
🔹 事件处理:处理请求数据、业务逻辑,或写回响应。
示意图:
客户端请求 -> worker epoll 监听 -> 事件触发 -> 回调函数处理 -> 响应客户端
4、实践样例
4.1 Nginx 配置 worker 数量
在 nginx.conf
中配置:
# 设置 worker 数量,一般设置为 CPU 核心数
worker_processes auto;
events {
# 使用 epoll 作为事件模型(Linux 下推荐)
use epoll;
# 单个 worker 最大连接数
worker_connections 10240;
}
说明:
🔹 worker_processes
决定 worker 进程数。
🔹 worker_connections
决定单个 worker 能处理的并发连接数。
🔹 理论最大并发数 ≈ worker_processes × worker_connections。
4.2 模拟高并发请求
使用 ab
(Apache Benchmark) 进行压力测试:
ab -n 100000 -c 1000 http://127.0.0.1/
🔹 -n
请求总数 100000
🔹 -c
并发数 1000
结果示例(部分输出):
Concurrency Level: 1000
Time taken for tests: 3.215 seconds
Complete requests: 100000
Failed requests: 0
Requests per second: 31105.23 [#/sec] (mean)
说明 Nginx 通过事件驱动,轻松支撑上万级并发。
4.3 验证 Nginx 事件模型
查看 Nginx worker 的事件模型:
nginx -V 2>&1 | grep --color=auto -o 'epoll\|select\|kqueue'
在 Linux 环境下一般会输出:
epoll
5、优势
🔹 高并发能力强
单线程 worker 支持上万连接。
🔹 低内存消耗
不依赖每连接一个线程/进程,避免大量上下文切换。
🔹 可扩展性强
配合反向代理、负载均衡,可以轻松扩展集群。
🔹 跨平台
Linux 用 epoll,BSD 用 kqueue,Windows 用 IOCP。
6、总结
🔹 Nginx 的高性能核心在于 事件驱动 + 异步非阻塞 I/O。
🔹 worker_processes
× worker_connections
决定理论并发数。
🔹 通过 epoll/kqueue
实现高效的事件循环。
👉 实践中,我们可以根据 CPU 数量 和 连接规模 来合理配置 worker_processes
与 worker_connections
,从而充分发挥 Nginx 的性能优势。