nginx高并发处理静态资源的核心是异步事件驱动+零拷贝:采用epoll监听万级连接状态变化,非阻塞i/o配合sendfile实现内核态直传,避免内存拷贝与轮询,结合keepalive复用连接、slab内存管理及多worker无锁协作,实现低开销百万级并发。

Nginx 处理静态资源高并发,核心不是“拼命加线程”,而是靠异步事件驱动把每个连接的读、写、超时都变成可调度的事件,全程不卡住、不等待、不拷贝多余数据。
事件循环统一监听所有连接
每个 worker 进程启动后,就进入一个永不退出的事件循环。它用 epoll(Linux)一次性监听成千上万个 socket 的状态变化——比如哪个文件已准备好读、哪个客户端缓冲区空了可写、哪个连接超时该关掉。有事才处理,没事就等内核通知,不轮询、不 sleep、不阻塞。
- 新连接到达时,worker 立即 accept(配合
multi_accept on可一次收多个) - 收到 HTTP 请求头后,立刻解析路径,定位静态文件,不等完整请求体(除非需要)
- 发现是 .jpg/.css/.js 等静态资源,直接走零拷贝路径,不经过用户态内存
非阻塞 I/O + 零拷贝加速文件传输
对静态文件,Nginx 不把内容先读进自己的内存再发出去,而是调用 sendfile() 让内核直接从磁盘 DMA 到 socket 发送缓冲区。整个过程没有用户态内存拷贝,也没有 read/write 两次系统调用。
- socket 设置为 non-blocking:send() 写不满就停,注册 write 事件等下次可写再续传
- 配合
tcp_nopush on合并小包,tcp_nodelay off控制延迟与吞吐平衡 - keepalive 默认开启,同一个 TCP 连接可复用处理多个静态请求,省握手挥手开销
连接与内存精细化管理
每个活跃连接只占极小内存(几 KB),背后是 Nginx 自研的 slab 分配器和连接池机制。超时控制也不靠独立线程轮询,而是把所有定时器(如 keepalive_timeout、read_timeout)统一挂到红黑树里,事件循环每次迭代顺带检查是否到期。
-
worker_connections 10240是单个 worker 能管的连接上限,实际承载能力取决于系统 fd 限制和内存 - 静态资源响应头精简、Gzip 压缩由模块异步完成,不影响主事件流
- 多 worker 进程间无锁协作,各自独立事件循环,CPU 核心利用率接近线性提升
配置上几个关键点要对齐场景
不是堆参数就行,得让事件驱动真正跑起来:
-
use epoll;显式启用高效事件模型(Linux 必开) -
accept_mutex on;避免多 worker 同时争抢新连接造成“惊群” -
sendfile on;+tcp_nopush on;是静态服务的黄金组合 -
keepalive_timeout 65;和keepalive_requests 100;控制复用深度,防长连接耗尽资源











