nginx 的 non-blocking i/o 不消除物理网络延迟,而是防止其导致资源耗尽和请求阻塞;通过非阻塞 socket + epoll/kqueue 实现高并发连接管理,配合 keepalive 复用、精细化超时控制及缓冲策略优化,保障高延迟下的服务可用性与响应效率。

Nginx 的 Non-blocking I/O 本身不直接“解决”网络延迟(如高 RTT、卫星链路、跨洲际传输等固有物理延迟),而是防止网络延迟引发的服务端资源耗尽和请求阻塞,从而保障系统在高延迟环境下的可用性与并发承载能力。
它通过以下方式应对由网络延迟带来的典型瓶颈:
避免慢连接拖垮整个服务
当客户端网络极慢(例如移动弱网、TCP 重传频繁、RTT 高达 1–2 秒),传统阻塞模型会为每个连接独占线程/进程,很快耗尽资源。Nginx 使用非阻塞 socket + epoll/kqueue 后:
- 每次 read() 若无数据立即返回 EAGAIN,不等待;
- 连接只是被保留在事件监听列表中,不消耗 CPU 或调度时间片;
- worker 进程可同时管理数万空闲或缓慢收发的连接,只在真正就绪时才处理。
配合 Keepalive 减少延迟敏感操作频次
高延迟下,TCP 三次握手和 TLS 握手开销被显著放大。Nginx 通过:
- 复用长连接(keepalive_timeout 控制空闲时间);
- 避免反复建立新连接带来的多倍 RTT 累积;
- 结合 upstream keepalive 指令复用到后端的连接,进一步降低链路层开销。
精细化超时控制,主动释放无效等待
网络延迟不可控,但等待行为必须可控。关键配置包括:
- client_header_timeout / client_body_timeout:限制客户端发送请求头/体的最大等待时间,防 Slowloris 类攻击;
- send_timeout:向客户端发响应时,两次 write 之间的最大间隔,避免因对方接收慢长期挂起连接;
- proxy_connect_timeout / proxy_read_timeout:约束与后端交互的各阶段时限,防止某台慢后端拖累全部请求。
缓冲策略适配延迟场景,减少“假卡顿”
在 HTTPS 下,TLS 记录帧默认 16KB,若 proxy_buffering on 且响应流式输出(如 SSE、日志流),Nginx 可能攒满缓冲区才加密发送,造成数百毫秒级人为延迟。应根据业务调整:
- 流式接口建议关闭 proxy_buffering 或调小 proxy_buffer_size;
- 启用 tcp_nodelay off(默认)合并小包,减少 PSH 包数量;
- 对大文件启用 sendfile + tcp_nopush,让内核批量处理 TLS 加密前的数据帧。
不复杂但容易忽略











