核心是让静态资源尽量不碰磁盘,通过浏览器缓存、零拷贝(sendfile)、内核页缓存、文件句柄缓存、按大小分层i/o等分层拦截优化,减少磁盘i/o与cpu开销。

核心是让静态资源尽量不碰磁盘——I/O等待时间长,本质是Nginx反复从磁盘读小文件,而没用好内存、内核和硬件能力。优化不是堆参数,而是分层拦截请求路径,把高频访问挡在离用户最近的地方。
浏览器端缓存:第一道防线
只要资源不变,后续访问完全不走服务器,直接消灭重复请求。
- 对常见静态后缀(js/css/png/font等)设置长期缓存,例如:
expires 1y;或add_header Cache-Control "public, max-age=31536000"; - 避免误配
Cache-Control: no-cache等全局禁用缓存指令,否则每次请求都触发完整服务链路 - 配合版本化 URL(如
app.a1b2c3.js),可安全设为永久缓存,更新时 URL 变化即自动失效
启用零拷贝与高效传输
跳过用户态内存拷贝,减少 CPU 和系统调用开销。
- 必须开启:
sendfile on;,让内核直接从页缓存送数据到 socket 缓冲区 - 搭配:
tcp_nopush on;,攒满 TCP 报文段再发,减少小包和中断次数 - 注意冲突:gzip、etag、expires、sub_filter 等模块会强制 sendfile 失效,纯静态服务建议关掉:
gzip off; etag off;
善用内核页缓存与文件系统优化
让热文件常驻内存,降低实际磁盘读取频次。
- 确认静态文件所在分区挂载时启用了
noatime,避免每次读取都写入访问时间戳 - SSD 存储可加
discard支持,维持长期写入性能 - 若热文件集明确(如首页几十个资源),可用
cat file > /dev/null预热,强制其进入页缓存
减少小文件元数据开销
高频小文件场景下,stat() 和 open() 调用本身就会成为瓶颈。
- 启用文件句柄与元数据缓存:
open_file_cache max=20000 inactive=30s; - 补充配置:
open_file_cache_valid 60s;、open_file_cache_min_uses 2;、open_file_cache_errors on; - 静态路径匹配用前缀或精确匹配(如
location /static/ { }),避免正则表达式解析开销 - 关闭日志:
access_log off;,尤其在 CDN 边缘或纯静态节点上
按文件大小分层调度 I/O 方式
不能一刀切。小文件靠缓存,大文件要避让缓存,防止挤占页缓存空间。
- 小文件(通常 directio 或
aio - 大文件(≥ 4MB):启用
directio 4m;和aio on;,绕过页缓存,异步直读磁盘 - 配置示例(放在 location 块内):
sendfile on;<br>aio on;<br>directio 4m;<br>output_buffers 1 128k;
不复杂但容易忽略。











