Nginx 的事件驱动框架是其高性能的核心,其处理流程基于 多阶段异步非阻塞 设计,结合 多进程模型(Master/Worker)和 事件通知机制(如 epoll、kqueue)。以下是其核心处理流程的详细分解:
Master 进程初始化:
nginx.conf
),监听端口(如 80、443)。worker_processes
配置决定)。Worker 进程初始化:
epoll
)。read
事件)。每个 Worker 进程运行一个 无限事件循环,处理流程如下:
epoll_wait
)阻塞等待事件:
accept
)、可读(recv
)、可写(send
)、超时等。keepalive
超时)。ngx_event_accept
,接受连接并分配连接池(ngx_connection_t
)。ngx_http_process_request_line
)。ngx_http_write_filter
)。aio_read
或线程池)。client_header_timeout
):
accept_mutex
防止惊群效应(多个 Worker 争抢新连接)。epoll
(Linux)/ kqueue
(BSD)高效管理海量连接。ngx_pool_t
),请求结束后统一释放。ngx_connection_t
)减少内存碎片。+---------------------+
| Worker Process |
+---------------------+
|
v
+---------------------+
| epoll_wait() | <--- 阻塞等待事件
+---------------------+
|
v
+---------------------+
| 事件分类处理 |
| - Accept 新连接 | --> ngx_event_accept()
| - Read 请求数据 | --> HTTP 模块解析
| - Write 发送响应 | --> 过滤链处理
| - Timer 超时检查 | --> 关闭连接
+---------------------+
|
v
+---------------------+
| 异步任务处理 |
| - 文件 I/O (aio) |
| - 反向代理(上游通信)|
+---------------------+
worker_connections
:调整单个 Worker 的最大连接数。use epoll
:明确指定高效事件模型。sendfile
:零拷贝传输静态文件。timer_resolution
:减少定时器精度以降低 CPU 开销。通过这种设计,Nginx 能够以极低资源消耗处理高并发请求(如 C10K 问题),同时保持高扩展性。