Nginx采用单线程事件循环+非阻塞I/O的事件驱动模型,worker进程间无共享连接状态,避免锁竞争与线程调度开销;需配合禁用阻塞模块、开启上游异步及合理超时设置。

Nginx 事件驱动模型不靠多线程并发,而是用少量 worker 进程 + 单线程事件循环 + 非阻塞 I/O 来处理高并发请求,天然绕开了多线程带来的同步开销。
单线程内无锁执行
每个 worker 进程内部是单线程,所有连接的读写、解析、响应都在同一个线程里顺序执行。这意味着:
- 不需要为共享资源(如连接状态、buffer、请求上下文)加互斥锁
- 避免了锁竞争导致的线程挂起、唤醒和等待队列管理
- 没有原子操作或内存屏障带来的额外 CPU 开销
进程间无共享连接状态
worker 进程彼此独立,各自维护自己的连接列表、内存池和事件队列:
- 连接数据不跨进程传递,无需在进程间同步状态
- 某个 worker 因上游慢或磁盘 IO 延迟而暂时卡住,不影响其他 worker 继续处理请求
- 像计数器这类极少数需共享的数据,只用轻量级原子操作(如 ngx_atomic_fetch_add),不引入复杂锁机制
事件驱动替代“等待即开线程”
传统多线程服务器为每个连接分配线程,结果大量线程阻塞在 I/O 上;Nginx 把“等数据”这件事交给操作系统:
- socket 全部设为 non-blocking,read/write 立即返回,不会让线程休眠
- 用 epoll/kqueue 批量监听成千上万个 fd,只在真正就绪时触发回调
- 整个过程不涉及线程调度器介入,也就没有因等待引发的抢占、切换、唤醒震荡
全链路非阻塞是前提
事件驱动的优势不是自动生效的,需要配置配合:
- 禁用阻塞式模块(如未设超时的 Lua 脚本)
- 上游代理开启异步支持(proxy_buffering off + proxy_http_version 1.1)
- 合理设置超时参数(proxy_read_timeout、client_header_timeout 等),防止 handler 长时间占用事件循环



















