nginx 通过单线程+非阻塞i/o+事件驱动模型实现高并发低延迟:所有socket设为非阻塞,用epoll_wait批量监听就绪事件,状态机分阶段处理http连接,并配合超时控制、sendfile优化及部署层协同(如tls会话复用、边缘部署)提升性能。

Nginx 并不靠“异步 I/O”解决延迟,而是用单线程 + 非阻塞 I/O + 事件驱动模型把等待成本压到最低——它不等数据,只响应就绪事件。
避免线程阻塞,让 CPU 始终有事可做
传统服务器(如 Apache)为每个请求分配线程,一旦遇到慢连接、慢磁盘或慢后端,线程就卡在 read()/write() 上,白白消耗栈空间和调度开销。Nginx 不这么做:
- 所有 socket 设为非阻塞:recv() 没数据时立刻返回 EAGAIN,不挂起;
- 用 epoll_wait() 批量监听成千上万个连接,只处理当前就绪的那些;
- 一个 worker 进程可同时管理数万空闲连接,连接挂起时不占 CPU,只在有事件(数据到达、超时、关闭)时才介入。
状态机驱动连接生命周期,分阶段调度
每个 HTTP 连接不是“一口气跑完”,而是被拆解为多个状态(如 waiting for request header → parsing → proxying → sending response),由事件循环分段推进:
- 上游响应慢?Nginx 挂起该请求,转头处理其他就绪连接;等 upstream 数据 ready 后,再恢复后续流程;
- 客户端上传慢?只收已到达的数据块,不阻塞整个 worker;
- 静态文件发送用 sendfile(),内核直接从 page cache 推到 socket buffer,省去用户态拷贝,减少 CPU 和内存开销。
超时与缓冲协同,防止慢连接拖垮整体
高延迟网络下,连接建立慢、RTT 长、重传多。Nginx 通过精细化控制把“等待不可控”变成“主动管理”:
- keepalive_timeout 控制复用窗口,减少三次握手和 TCP 慢启动次数;
- client_header_timeout 和 client_body_timeout 防止恶意或异常慢客户端长期占用连接;
- tcp_nodelay on(对小响应)+ tcp_nopush on(配合 sendfile)平衡发包节奏,避免 Nagle 算法引入毫秒级延迟;
- open_file_cache 缓存文件句柄和元信息,避免反复 open/stat 系统调用带来的微小但累积的延迟。
部署层面补足模型短板
事件驱动再高效,也绕不开物理距离和协议开销。真实低延迟需要协同优化:
- TLS 层启用 ssl_session_cache shared,复用会话,跳过完整握手;
- 对移动端或弱网用户,设 ssl_buffer_size ≥ 4k,降低 TLS 记录帧数量;
- 关键服务前置到边缘节点(CDN 或区域 POP),缩短用户到第一跳的 RTT;
- 避免在 Nginx 中执行同步耗时操作(如 auth_request 调外部接口、未缓存的 Lua 脚本),否则会打断事件循环节奏。











