nginx通过非阻塞i/o与事件驱动模型实现高性能:单个worker进程利用epoll/kqueue监听数万连接,i/o操作均设为non-blocking,仅在数据就绪时处理,避免线程阻塞和资源浪费,配合worker_processes auto、worker_connections等配置,轻松支撑10万+并发。

Nginx 用非阻塞 I/O(Non-blocking IO)把“等”的时间腾出来干别的事,单个 worker 进程就能同时盯住成千上万个连接,而不是一个连接占一个线程、卡在那儿空转。它不靠堆线程数量硬扛并发,而是靠高效调度和零等待来放大每个进程的吞吐。
Non-blocking IO 是怎么工作的
- 客户端发来请求,内核把数据放到缓冲区后立刻返回,Nginx 不会停在这儿等“读完”,而是继续处理其他事件
- 当数据真正就绪(比如响应要发出去、文件要读取),内核通过 epoll(Linux)或 kqueue(BSD)通知 Nginx,它再集中处理
- 所有 I/O 操作(accept、read、write、sendfile 等)都设为 non-blocking 模式,避免任何一步卡死整个进程
和传统阻塞模型对比更清楚
- 阻塞模式:一个连接 → 一个线程 → 线程在 read() 或 write() 时挂起 → CPU 切换开销大、内存占用高、并发上限低(通常几千)
- Non-blocking + 事件驱动:一个 worker 进程 → 监听数万连接 → 只在有实际 I/O 就绪时才介入 → 资源利用率高、延迟低、轻松支撑 10 万+ 并发
关键配置配合才能发挥效果
-
worker_processes auto;—— 让每个 CPU 核跑一个 worker,避免跨核调度损耗 -
worker_connections 4096;(或更高)—— 每个 worker 能管的连接数,需结合ulimit -n设置一致 -
use epoll;(Linux 默认启用)—— 确保使用高性能事件分发机制,不用 select/poll -
multi_accept on;—— 让 worker 一次 accept 多个新连接,减少事件循环空转
实际影响不只是“能连更多”
- 减少上下文切换:没有频繁线程创建/销毁,CPU 更专注在业务逻辑和网络调度上
- 缓冲区复用:Nginx 自带 slab 内存池,连接生命周期内复用 buffer,降低 GC 压力
- 支持长连接复用:配合
keepalive_timeout 65;,一个 TCP 连接可承载多个 HTTP 请求,进一步摊薄建连成本
不复杂但容易忽略











