nginx采用单线程+事件驱动+非阻塞i/o模型,通过epoll_wait批量监听socket、分阶段注册事件、零锁无共享设计,实现高并发低开销;而多线程模型为每连接分配线程,存在阻塞、高上下文切换与内存开销。

核心区别在于执行模型与资源分配方式
多线程模型为每个连接(或请求)分配一个独立线程,线程在 read/write 等系统调用时会阻塞,CPU 空等;而 Nginx 每个 worker 进程只用一个执行流,靠 epoll_wait 等系统调用批量监听成千上万个 socket,内核通知哪个 fd 就绪,就处理哪个,全程不阻塞。
上下文切换与锁竞争几乎归零
线程切换需保存/恢复寄存器、栈、TLB 缓存等,每次开销约 1–5 微秒;10 万并发下若用线程模型,光切换就可能吃掉数 % CPU。Nginx 的 worker 进程间无共享连接状态,各自管理自己的连接结构体和内存池,业务路径基本不加锁,避免了死锁和等待延迟。
内存占用量级差异明显
一个线程默认栈空间通常为 1–8 MB,1 万个连接 ≈ 1 万个线程 ≈ 至少 10 GB 内存;而 Nginx 每个连接仅需约 2–4 KB(buffer + ngx_connection_t + 请求上下文),同样 1 万个连接仅占用 ~40 MB,且不随连接数线性增长。
事件是分阶段注册、按需触发的
不同于多线程中“一个线程从头跑到尾”,Nginx 把请求拆成多个事件阶段:
- 监听 socket 注册 accept 读事件 → 触发 ngx_event_accept
- 新连接建立后,注册读事件 → 绑定 ngx_http_process_request_line
- 解析完 header 后,才决定是否注册 body 读事件或 upstream 写事件
- 响应发送前,才为写事件挂载 ngx_http_writer
每个 handler 执行完,立刻交还控制权给事件循环,不长期占用 worker。











