nginx event loop 是每个 worker 进程内同步运行的单线程主循环,基于 epoll 等 i/o 多路复用驱动连接接入、http 阶段处理、响应发送及超时清理全过程。

Nginx 的 Event Loop 不是传统意义上的“异步回调黑盒”,而是每个 worker 进程内同步运行的单线程主循环,靠系统级 I/O 多路复用驱动请求从接入到响应的完整生命周期。
监听新连接:从 accept 到连接初始化
worker 进程启动时,将监听 socket(如 80 端口)注册到 epoll 实例,关注 EPOLLIN 事件。当有新 TCP 握手完成,epoll_wait 返回就绪通知,触发 ngx_event_accept:
- 调用 accept() 获取客户端 socket,设为非阻塞模式
- 分配 ngx_connection_t 结构体,绑定读事件 handler(默认为 ngx_http_init_request)
- 该连接立即进入事件队列,等待下一轮循环处理
请求解析:分阶段推进 HTTP 生命周期
一旦客户端 socket 可读,Event Loop 调用 rev->handler,启动 HTTP 阶段机。整个流程按 11 个预定义阶段顺序执行,每个阶段由模块注册的 handler 处理:
- NGX_HTTP_POST_READ_PHASE:刚读完请求头,常用于 realip、geo 地址修正
- NGX_HTTP_SERVER_REWRITE_PHASE 和 NGX_HTTP_REWRITE_PHASE:执行 server/location 块中的 rewrite 指令
- NGX_HTTP_ACCESS_PHASE:运行 limit_req、auth_basic 等访问控制逻辑
- NGX_HTTP_CONTENT_PHASE:最终内容生成阶段,静态文件走 ngx_http_static_handler,代理请求走 ngx_http_proxy_handler
各阶段 handler 返回 NGX_AGAIN 表示需等待后续 I/O(如 body 未收全),返回 NGX_OK 则自动进入下一阶段,返回错误码则直接终止请求。
响应发送:可写事件驱动的异步输出
响应数据准备好后,并不立即 send,而是先检查 socket 发送缓冲区:
- 若可写,调用 ngx_http_writer 直接发送响应头或部分响应体
- 若 send 返回 EAGAIN,说明缓冲区已满,临时注册 EPOLLOUT 事件,等待内核通知可写再继续
- 发送完成或遇到错误时,清理连接状态;若启用 keepalive,重置定时器并重新注册读事件等待下一个请求
超时与清理:红黑树统一调度定时任务
所有超时(client_header_timeout、keepalive_timeout 等)并非独立线程维护,而是由 Event Loop 统一管理:
- 每个连接/请求的超时节点插入全局红黑树 ngx_event_timer_rbtree,按到期时间排序
- 每次循环开始前,ngx_event_find_timer() 查出最近超时时间,作为 epoll_wait 的 timeout 参数
- 超时触发后,对应 handler(如 ngx_http_set_keepalive)被同步调用,执行关闭、清理或降级操作











