Nginx 的高并发能力源于非阻塞I/O、事件循环与回调机制的垂直贯通:socket层设为non-blocking,事件循环(如epoll_wait)统一调度就绪事件,各模块以回调函数注册逻辑并即时响应,全程规避阻塞操作。

在 Nginx 中,“Non-blocking”(非阻塞)和“异步回调”并非两个独立特性,而是其事件驱动架构的一体两面:Nginx 通过 epoll/kqueue 等高效 I/O 多路复用机制实现 socket 层的非阻塞读写,并将具体业务逻辑封装为回调函数,在事件就绪时由事件循环主动触发——这才是真正意义上的深度集成。
非阻塞 I/O 是基础支撑
Nginx 所有网络套接字均设置为 non-blocking 模式(如调用 fcntl(fd, F_SETFL, O_NONBLOCK))。这意味着:
- read() 在无数据可读时不挂起线程,而是立即返回 EAGAIN/EWOULDBLOCK;
- write() 在发送缓冲区满时也立即返回错误,而非等待;
- 后续操作交由事件循环统一监控 fd 状态,避免轮询或阻塞等待。
事件循环是调度中枢
Nginx 的核心是单线程(主工作进程)事件循环(ngx_event_process_cycle),它:
- 周期性调用 epoll_wait()(Linux)或 kqueue()(BSD)获取就绪事件;
- 对每个就绪 fd,根据注册类型(读就绪、写就绪、超时等)匹配对应的 handler 函数;
- 不做复杂调度,只做轻量分发,确保高吞吐与低延迟。
回调函数承载实际逻辑
所有模块行为都以回调形式注册进事件系统:
- HTTP 模块注册 ngx_http_init_connection 作为新连接接入回调;
- 连接建立后,注册 ngx_http_wait_request_handler 处理请求头读取;
- 请求解析完成,再切换为 ngx_http_core_run_phases 执行各处理阶段;
- 每个回调执行完即返回,不等待下游(如 upstream、磁盘 IO),需要继续等待时重新注册对应事件。
零阻塞依赖的设计哲学
Nginx 主动规避任何可能引发阻塞的操作:
- 文件读写默认使用内核 sendfile() 或 AIO(需配置启用),避免用户态拷贝与阻塞;
- DNS 查询走自研的异步 resolver,不调用阻塞式 gethostbyname;
- SSL 握手在 OpenSSL 支持下通过 SSL_ERROR_WANT_READ/WRITE 机制配合事件循环重入;
- 第三方模块若引入阻塞调用(如同步 MySQL 查询),会直接拖垮整个 worker 进程性能。
这种集成不是简单叠加,而是从 socket 层、事件层到模块层的垂直贯通:非阻塞提供可能性,事件循环提供时机,回调机制提供可组合性。三者缺一不可,共同构成 Nginx 高并发能力的底层支柱。










