核心是分层缓存与传输优化:浏览器端用cache-control精准控制强缓存,nginx启用open_file_cache减少系统调用,sendfile零拷贝配合tcp_nopush/tcp_nodelay提升传输效率,并与cdn协同统一ttl策略。

让 Nginx 服务静态资源更快,核心不是堆硬件,而是把缓存用对、用细——既要减少客户端重复请求,也要降低 Nginx 自身的磁盘和系统调用开销,还要兼顾 CDN 协同和浏览器行为。
浏览器端缓存:用 Cache-Control 精准控制
别只依赖 expires,它生成的只是过期时间点,而 Cache-Control 才是现代缓存协作的语言。关键指令要组合使用:
-
带哈希指纹的文件(如
app.a1b2c3.js、style.f4e5d6.css):直接设为长期不可变,public, max-age=31536000, immutable;浏览器知道内容不会变,连条件请求都跳过 -
无版本号的通用资源(如
common.css、logo.png):设较短有效期,比如public, max-age=3600, must-revalidate;既避免频繁回源,又保证更新后能及时生效 -
不建议缓存的内容(如含用户态的 HTML 片段):用
private, no-cache,或干脆no-store;防止敏感信息被代理或 CDN 错误缓存
服务器端元数据缓存:减少 open() 系统调用
高频访问下,反复查文件大小、修改时间、权限等元数据会拖慢响应。启用 open_file_cache 能把这类信息常驻内存:
-
open_file_cache max=100000 inactive=20s;—— 缓存 10 万个文件项,20 秒未访问就淘汰 -
open_file_cache_valid 30s;—— 每 30 秒校验一次缓存项是否仍有效(比如文件没被删) -
open_file_cache_min_uses 2;—— 同一文件至少被访问两次才进缓存,防突发流量污染 -
open_file_cache_errors on;—— 把“文件不存在”也缓存住,避免反复触发磁盘查找
传输层优化:零拷贝 + TCP 协同
从磁盘读文件再发给客户端,传统方式要经过内核 → 用户态 → 内核 → 网络栈,中间多次复制。Nginx 提供更高效的路径:
-
sendfile on;—— 开启内核级零拷贝,尤其对图片、字体、视频等大文件效果明显 -
tcp_nopush on;—— 配合 sendfile,攒够一个 TCP 包再发,减少小包数量 -
tcp_nodelay on;—— 对小资源(如 favicon.ico、woff2 字体),禁用 Nagle 算法,立即响应
与 CDN 协同:让边缘节点替你扛流量
Nginx 是源站,CDN 是分发层,两者配合才能真正实现全球加速:
- 确保 Nginx 响应头中明确带
Cache-Control: public, max-age=...,CDN 会据此设置边缘缓存 TTL - 按后缀精细化配置:JS/CSS/字体设 1 年,图片设 1 周,HTML 设几分钟;CDN 控制台可按类型覆盖规则
- 启用
add_header Vary "Accept-Encoding";(配合 Gzip/Brotli),避免压缩与非压缩版本缓存混淆 - 回源时尽量用 HTTPS,且确保 Nginx 的 SSL 配置支持 TLS 1.3 和 OCSP Stapling,缩短握手延迟











