核心是分层控制:浏览器端用cache-control减少重复请求,nginx本地用proxy_cache降低回源压力,再配合cdn实现边缘加速;三者协同才能把静态资源加载做到又快又稳。

核心是分层控制:浏览器端用 Cache-Control 减少重复请求,Nginx 本地用 proxy_cache 降低回源压力,再配合 CDN 实现边缘加速。三者协同才能把静态资源加载做到又快又稳。
给浏览器明确缓存指令
静态资源(JS/CSS/图片/字体)一旦发布就极少变动,应设长期缓存,并利用哈希指纹保证更新一致性。推荐直接用 add_header 设置完整策略:
-
public:允许 CDN 和代理缓存 -
max-age=31536000:缓存 1 年(365 天) -
immutable:告诉浏览器该资源不会在有效期内变更,无需发条件请求
配置示例(放在对应 location 块中):
location ~* \.(js|css|png|jpg|jpeg|gif|woff2|ttf|eot)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
}
启用 Nginx 本地反向代理缓存
当用户首次请求未被 CDN 缓存时,Nginx 可将后端返回的内容暂存本地,后续相同请求直接响应,避免穿透到上游服务。
- 先在
http块定义缓存区:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=1h use_temp_path=off; - 在
location中启用:proxy_cache my_cache; - 按状态码设置缓存时间:
proxy_cache_valid 200 304 1h; - 加锁防缓存击穿:
proxy_cache_lock on; - 异常时返回旧缓存提升可用性:
proxy_cache_use_stale error timeout http_500;
注意:仅对纯静态或稳定接口启用,动态页、带 Cookie 的请求需通过 proxy_cache_bypass 跳过缓存。
优化文件系统级读取效率
Nginx 自身读取磁盘文件时,也能通过内核机制减少开销:
-
sendfile on;:启用零拷贝,避免用户态与内核态间数据复制 -
tcp_nopush on;:合并多个响应头和数据包,减少 TCP 包数量 -
open_file_cache max=1000 inactive=30s;:缓存文件句柄和元信息,降低 stat 系统调用频率 -
open_file_cache_valid 60s;:每分钟检查一次缓存项有效性
与 CDN 协同控制缓存生命周期
CDN 回源依赖 Nginx 返回的 Cache-Control 或 Expires 头。若 CDN 控制台缓存规则与 Nginx 不一致,容易出现“CDN 缓存久、源站已更新”问题。
- 确保 Nginx 配置中
Cache-Control的max-age与 CDN 后台设置一致 - 对不带版本号的资源(如
/style.css),建议设较短缓存(如 1 小时),避免更新不及时 - 对带哈希的资源(如
/app.a1b2c3.js),可放心设为 1 年 - 添加调试头便于排查:
add_header X-Cache-Status $upstream_cache_status;











