核心是分层协同优化:客户端用cache-control精准控制缓存行为,nginx用open_file_cache(max=100000 inactive=20s valid=30s min_uses=2 errors on)缓存文件元数据降系统调用,再配合sendfile、tcp_nopush、tcp_nodelay实现零拷贝与tcp优化。

核心是让浏览器和中间节点少发请求、少读磁盘、少走网络。不是堆配置,而是分层控制:客户端缓存 + 文件元数据缓存 + 传输优化三者协同。
用 Cache-Control 精准控制浏览器怎么缓
别只依赖 expires,优先用 add_header Cache-Control 设置明确策略:
- 带哈希的 JS/CSS/字体(如
app.abc123.js):加"public, max-age=31536000, immutable"—— 浏览器一年内不验证,彻底跳过条件请求 - 无版本号的通用资源(如
common.css):设"public, max-age=3600, must-revalidate"—— 缓一小时,过期后必须校验 - 图标、小图等低延迟敏感资源:可设
max-age=86400,避免频繁回源但不过度保守
让 Nginx 自己少查磁盘:open_file_cache 是关键
频繁读文件属性(大小、修改时间)会卡在系统调用上。启用内存级元数据缓存能显著降开销:
-
open_file_cache max=100000 inactive=20s;—— 缓 10 万个文件项,20 秒没访问就清理 -
open_file_cache_valid 30s;—— 每 30 秒检查缓存项是否还有效(比如文件是否被删) -
open_file_cache_min_uses 2;—— 同一文件至少被访问 2 次才进缓存,防突发请求污染 -
open_file_cache_errors on;—— 连“文件不存在”也缓起来,避免反复触发磁盘查找
减少数据搬运:零拷贝与 TCP 层调优
传统方式要从磁盘读到用户态内存,再复制到 socket 缓冲区。绕过这一步能省 CPU 和内存带宽:
-
sendfile on;—— 必开,尤其对图片、视频等大文件,内核直接送数据到网卡 -
tcp_nopush on;—— 配合 sendfile,攒够 TCP 包再发,减少小包数量 -
tcp_nodelay on;—— 对小资源(如 favicon.ico、woff2 字体),禁用 Nagle 算法,立即响应
配合 CDN 实现边缘加速
Nginx 本身缓得好,只是单点优化;加上 CDN 才真正实现全局提速:
- 确保 Nginx 响应头含
Cache-Control或Expires,CDN 会按此设置边缘 TTL - 按文件类型在 CDN 后台分级设 TTL:JS/CSS 设 1 年,HTML 设 10 分钟,动态接口设 0
- 使用带哈希的文件名(
main.a1b2c3.js),更新时 URL 变,CDN 自动加载新版本,无需主动刷新











