提高Nginx静态资源吞吐的关键是优化传输效率而非堆叠硬件:启用sendfile零拷贝并配套tcp_nopush/tc_nodelay、按资源大小分路径调度TCP参数、预压缩+长缓存减流量、收敛系统开销。

要提高 Nginx 静态资源服务的文件传输吞吐,关键不是堆带宽或调高并发数,而是让每字节传得更稳、更少、更久——减少无效搬运、压缩冗余体积、延长缓存复用周期。实际效果常体现为:相同带宽下 QPS 提升 20%–50%,系统态 CPU(sy%)明显下降,TCP 重传率降低。
启用零拷贝路径并守住它
sendfile 是吞吐提升的底层基础,但它极易退化,必须成套配置且规避干扰:
- 必须同时开启
sendfile on;、tcp_nopush on;、tcp_nodelay off;(注意不是on) - 禁用任何触发用户态读写的操作:关掉
gzip on(改用gzip_static)、禁用etag动态生成、避免Range请求(如视频拖拽)、不把静态文件放在 NFS/CIFS 上 - 验证是否生效:用
strace -p $(pgrep nginx) -e trace=sendfile64观察 worker 进程是否持续调用sendfile64,而非read+write
按资源特性分路径调度 TCP 行为
吞吐优化不是“一刀切”,而是区分大文件与小资源的传输逻辑:
- 对 JS/CSS/woff2/webp 等 ≤500KB 的首屏关键资源:
tcp_nopush on; tcp_nodelay on;(兼顾包效率与响应尾延迟) - 对 >1MB 的图片、视频等大文件:
tcp_nopush on; tcp_nodelay off;(专注填满 MTU,减少小包数量) - 对 favicon.ico、robots.txt 等 ≤1KB 资源:
tcp_nodelay on;单独启用,可降首字节延迟 100–200ms - 所有配置均放在具体
location块中,而非全局http段
用预压缩 + 长缓存从源头减流量
传输吞吐瓶颈常来自重复拉取,而非单次慢:
- 构建时生成
.gz文件(如app.js.gz),Nginx 启用gzip_static on;并关闭gzip on;,文本类资源体积直降 60%–80%,零 CPU 开销 - 对带哈希或版本号的资源(如
main.a1b2c3.js):expires 1y; add_header Cache-Control "public, immutable"; - 对无哈希的通用资源(如
favicon.ico):expires 30d; - 纯静态
location中关闭日志:access_log off;,避免 I/O 抢占磁盘与网络带宽
配套收敛系统开销
高吞吐需要稳定底层支撑:
- 开启
open_file_cache缓存文件句柄与元数据:open_file_cache max=10000 inactive=60s; open_file_cache_valid 60s; open_file_cache_min_uses 2; - 静态 location 使用前缀匹配(如
location /img/),避开正则匹配带来的 PCRE 计算 - 大文件(≥4MB)可加
read_ahead 1m;,提示内核预加载页缓存(SSD 上效果显著)
不复杂但容易忽略。


















