nginx缓存优化需分客户端和代理两层配置:客户端缓存通过cache-control等响应头控制浏览器行为,代理缓存需定义cache_path并配置proxy_cache相关指令实现后端响应暂存。

客户端缓存(浏览器端)
让浏览器自己存住静态资源,减少重复下载。关键靠 `Cache-Control` 和 `Expires` 响应头:对带哈希名的资源(如 app.abc123.js),可放心设为长期不可变:
add_header Cache-Control "public, max-age=31536000, immutable" always;- 搭配
access_log off;关闭日志,减少磁盘写入
对普通静态文件(如未哈希的 style.css),缓存30天较稳妥:
add_header Cache-Control "public, max-age=2592000" always;
HTML 文件必须谨慎处理,避免用户看不到更新:
add_header Cache-Control "private, no-cache, must-revalidate" always;- 依赖 Nginx 自带的
ETag或Last-Modified,浏览器会发条件请求,服务端返回304 Not Modified即可
代理缓存(Nginx 反向代理层)
让 Nginx 暂存后端响应,减轻源站压力。需先定义缓存区,再在 location 中启用:在 http 块里声明缓存路径和区域:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;-
keys_zone是内存索引区,10MB 足够支撑数万 URL;max_size控制磁盘总用量;inactive表示60分钟没被访问就自动清理
在 server 或 location 块中启用并控制行为:
-
proxy_cache my_cache;—— 绑定前面定义的缓存区 -
proxy_cache_key "$scheme$request_method$host$request_uri";—— 排除 Cookie、时间戳等干扰项,确保相同 URL 总是命中同一缓存 -
proxy_cache_valid 200 302 10m;—— 成功响应缓存10分钟;404可设为1m防穿透 -
proxy_cache_lock on;—— 防止多个并发请求同时回源刷新同一缓存(防击穿) -
proxy_cache_use_stale error timeout updating;—— 后端出问题时,仍可返回旧缓存,保障可用性
缓存清理与验证
上线更新后,得能快速清掉旧缓存:加一个 purge 接口(仅限内网或可信IP):
location ~ /purge(/.*) { allow 127.0.0.1; deny all; proxy_cache_purge my_cache "$scheme$request_method$host$1"; }- 调用方式:
curl -X PURGE http://example.com/purge/xxx.js
验证是否生效,看响应头:
- 加
add_header X-Cache-Status $upstream_cache_status;,返回值可能是HIT、MISS或EXPIRED - 用
curl -I查看响应头,确认Cache-Control、ETag等是否正确输出











