Nginx通过事件驱动机制实现高并发,不为每个连接创建进程/线程,用epoll/kqueue统一监听、状态机处理请求、内存池管理内存、非阻塞I/O和内核零拷贝等手段,大幅降低资源开销。

Nginx 的异步事件驱动不是靠“堆资源”来扛并发,而是从机制上砍掉大量本不该存在的资源开销。它不为每个连接单独分配进程或线程,也不在等待时空耗 CPU 和内存,真正把资源用在“有事可做”的时刻。
一个 worker 进程管数万连接,省掉 99% 的进程/线程开销
传统模型(如 Apache prefork)每来一个连接就 fork 一个新进程,每个进程至少占用几 MB 内存、独立栈空间、上下文状态;而 Nginx 的 worker 进程用 epoll/kqueue 统一监听所有 socket,连接建立后只注册事件、记录状态,不生成新实体。
- 连接对象复用连接池,生命周期由事件循环统一管理
- 内存按需从 ngx_pool_t 分配,小块偏移取、大块走 large 链表,整批释放,无 malloc 碎片和锁争用
- worker_processes 设为 auto,让进程数严格匹配 CPU 核心数,避免上下文切换浪费
I/O 不卡住,CPU 和内存全程不闲置
所有 socket 设为非阻塞模式,read/write 立即返回:有数据就读,没数据就 EAGAIN,立刻转向处理其他就绪事件。
- 没有“等数据来”这个动作,也就没有挂起、唤醒、调度的开销
- 一次 recv 可能只收半截 HTTP 头,Nginx 用状态机记下“已读 header,待收 body”,下次事件再续
- send 也一样:发不完就暂存 output buffer,等 write event 触发再继续,不阻塞当前循环
系统级协同减少隐性冗余
很多资源浪费其实不在 Nginx 本身,而在配置或上下游配合不当:
- 日志写入启用 buffered 或异步模块,避免 access_log 成为同步 I/O 瓶颈
- 静态文件用 sendfile(),让内核直接搬运,跳过用户态内存拷贝,省 CPU 也省 buffer 占用
- SSL 握手启用 ssl_session_cache 和合理 ssl_buffer_size,避免重复加解密消耗
- 关闭不用模块(如 autoindex、ssi)、禁用 server_tokens、限制 client_header_buffer_size(1k 足够多数请求)
超时与调度不靠额外线程,红黑树+epoll 一体管理
连接读写超时、keepalive 超时,全插入红黑树,事件循环每次进 epoll_wait 前先检查顶端是否到期,把最小超时值传给 timeout 参数——精度高、无轮询、不新增线程。
本质上,Nginx 把“资源冗余”定义得很清楚:不干活时占着的内存、不响应时挂着的进程、没数据时空转的 CPU,都是冗余。它用事件注册代替被动等待,用回调驱动代替线程抢占,用内核协作代替用户态搬运。不复杂但容易忽略。



















