Nginx的Event Loop是调度中枢而非执行单元,负责监听、分发和推进事件;真正处理请求的是模块注册的回调函数,通过非阻塞I/O、事件驱动、多进程隔离与内核机制协同实现高并发。

Nginx 的 Event Loop 不是“处理”请求的执行单元,而是调度中枢——它不直接执行业务逻辑,只负责监听、分发和推进事件。真正处理请求的是各模块注册的回调函数,Event Loop 把它们串成一条可中断、可恢复的协作链。
事件驱动:靠内核通知,不主动轮询
每个 worker 进程运行一个独立的 Event Loop,持续调用 epoll_wait(Linux)等待内核通知。当有新连接到达、数据可读、缓冲区可写或超时发生时,内核才唤醒进程,返回就绪事件列表。整个过程无空转、无忙等,CPU 始终处于低负载状态。
- 监听 socket 可读 → 触发 accept,建立新连接
- 客户端 socket 可读 → 调用 HTTP 模块解析请求头或接收请求体
- socket 可写 → 将响应内容从内存或文件发送出去
- 定时器超时 → 关闭空闲连接或触发重试逻辑
非阻塞 I/O:每一步都可暂停、可挂起
所有网络操作(accept、recv、send)都设为非阻塞模式。比如读取大请求体时,若一次 recv 没收完,Event Loop 不会卡住,而是继续处理其他连接;等下次该 socket 再次可读,再接着收。写响应也一样:若内核发送缓冲区满,就暂停写操作,注册 write 事件,等可写再继续。
- 连接生命周期由状态机管理(如 NGX_HTTP_READING、NGX_HTTP_WRITING)
- 每个连接只占约 2–4 KB 内存,不含线程栈或上下文切换开销
- 单 worker 轻松承载上万连接,关键在“轻量结构 + 事件分阶段推进”
异步协作:网络与磁盘 I/O 分离调度
Event Loop 只管网络事件,不管磁盘读。遇到静态文件请求时:
- 若启用 sendfile on,由内核直接 DMA 传输,不经过用户态,无阻塞
- 若启用 aio on + directio,文件读交由内核 AIO 线程完成,worker 继续处理其他请求
- 未启用优化时,默认同步 read() 会短暂阻塞当前 worker,但多 worker 进程模型保证其他进程仍可响应
也就是说,Nginx 的“异步并发”不是靠单线程模拟并行,而是靠事件分发 + 非阻塞 + 多进程隔离 + 内核机制协同实现的。
模块化回调:功能扩展不影响事件效率
HTTP 解析、反向代理、缓存、SSL 握手等,都是模块注册的回调函数。Event Loop 只负责在对应事件就绪时调用它们,彼此解耦。比如:
- 收到完整请求头 → 调用 ngx_http_process_request_line
- 需要转发到 upstream → 启动异步连接,注册后端 socket 读写事件
- 后端响应返回 → 切回前端连接,继续发送响应体
整个流程中,同一个 worker 可同时推进多个请求的不同阶段,没有“一个请求必须走完才能处理下一个”的限制。


















