Nginx高性能反向代理依赖非阻塞I/O的精准落地:监听阶段用accept_mutex或SO_REUSEPORT避免惊群;请求处理采用事件驱动边收边转;后端交互支持连接复用与异步探测;响应输出启用sendfile零拷贝及内存池管理。

监听与接入:accept 不阻塞,靠互斥锁+事件注册
新连接到来时,Nginx 不会让 worker 进程在 accept() 上傻等。所有 worker 共享一个 listen socket,但通过 accept_mutex 保证同一时刻只有一个 worker 去调用 accept。抢到锁的 worker 把该 socket 注册为“可读事件”,内核一就绪就通知它处理——整个过程不阻塞、不空转、不浪费唤醒开销。
- 默认开启 accept_mutex,避免“惊群效应”(多个进程被唤醒却只有一人干活)
- 若使用 SO_REUSEPORT(Linux 3.9+),可关闭 accept_mutex,由内核分发连接,进一步降低锁竞争
- listen 指令中加 reuseport 参数即可启用,适合高并发入口场景
请求读取与转发:I/O 拆成事件,边收边转
客户端发来请求头或大包体,Nginx 不等数据全到才动手。它用非阻塞 socket 接收,一次收多少算多少,收完触发“读就绪”事件;后端响应返回时也一样——收到一点就处理一点,不等整条响应流结束。
- proxy_buffering 开启时,Nginx 先收全响应再吐给客户端,避免长连接挂起;关闭时则流式透传,降低延迟但要求后端稳定
- proxy_buffer_size 控制 header 缓冲区,太小会导致频繁 realloc;proxy_buffers 控制 body 缓冲区数量和大小,建议按典型响应体调整
- 对超大上传,配合 client_max_body_size 和 client_body_buffer_size,防止缓冲区溢出退到磁盘临时文件
后端交互:连接复用 + 异步探测,不等不卡
和 upstream 通信时,Nginx 把建连、发请求、收响应拆成独立步骤。TCP 连接建立耗时?它不干等,先去处理其他就绪事件;后端还没回?它把当前上下文挂起,等 epoll 通知“socket 可写/可读”再继续。
- upstream 中配置 keepalive 50,复用空闲连接,省掉三次握手和慢启动
- health_check 使用异步方式探测,不影响主请求流程;失败计数(fails)、恢复计数(passes)需匹配业务容忍度
- queue 指令配合 least_conn 或 ip_hash,在上游繁忙时暂存请求,而不是立刻返回 502
响应输出与释放:零拷贝 + 内存池,减少搬运和分配
响应发回客户端时,Nginx 尽量绕过用户态内存拷贝。静态文件走 sendfile() 系统调用,数据直接从磁盘页缓存送到网卡;动态响应则靠 slab 内存池管理 buffer,避免 malloc/free 频繁触发锁和碎片。
- 启用 sendfile on; 和 tcp_nopush on;,合并 TCP 小包,提升吞吐
- tcp_nodelay on; 可禁用 Nagle 算法,适合实时性要求高的接口(如 WebSocket、API)
- access_log 使用 buffer=64k flush=5s,缓解磁盘 I/O 压力,避免每次写日志都阻塞事件循环



















