关键在于区分资源类型、控制缓存生命周期、避免误存动态内容:需定义独立缓存区(proxy_cache_path + keys_zone),按状态码和类型设proxy_cache_valid,精准配置proxy_cache_key,并协同cache-control头实现服务端与浏览器双层缓存。

直接用缓存降低响应延迟、节省带宽、减轻后端压力,关键不在“加缓存”,而在“加对缓存”——得区分资源类型、控制缓存生命周期、避免误存动态内容。
明确缓存存放位置和容量
缓存必须先定义存储路径和内存索引区,否则所有 proxy_cache 指令都不生效:
-
proxy_cache_path 指定磁盘路径(如
/var/cache/nginx),需确保 Nginx 进程有读写权限 -
keys_zone 是共享内存区,名字要和后续
proxy_cache指令一致,大小按 key 数量估算(10MB 约支持 8 万个缓存项) -
levels=1:2 设两级目录结构,防止单目录文件爆炸;inactive 控制冷数据自动清理(如
inactive=1h表示 1 小时未访问即淘汰) -
max_size 限制总磁盘用量(如
max_size=20g),超限时按 LRU 清理最久未用项
按状态码和资源类型设定缓存有效期
不同响应应有不同缓存策略,不能一刀切:
- 对成功响应(200/206/304)单独设长时效:
proxy_cache_valid 200 206 304 10m - 对错误响应(如 404)设短时效或不缓存:
proxy_cache_valid 404 1m或proxy_cache_valid 404 0(禁用缓存) - 用
map指令结合$sent_http_content_type实现更精细控制,比如 HTML 设为epoch(立即过期),JS/CSS 设为1y
精准控制缓存键与命中逻辑
缓存键(key)决定哪些请求算“相同”,默认值容易导致缓存污染:
- 基础键建议至少包含
$host$request_uri,避免不同域名混用同一缓存 - 若后端依赖 Cookie(如用户个性化内容),需加入
$cookie_user_id等变量,但注意:含敏感信息的 Cookie 不宜进 key - 启用
proxy_cache_lock on防止缓存穿透——多个并发请求未命中时,只放行一个去回源,其余等待结果 - 加
add_header X-Cache-Status $upstream_cache_status方便调试,返回 HIT / MISS / BYPASS 状态
配合 Cache-Control 头强化客户端行为
服务端缓存(proxy_cache)和浏览器缓存是两层机制,需协同:
- 静态资源(JS/CSS/字体/图片)用
public, max-age=31536000, immutable,告诉浏览器可长期缓存且内容不变 - HTML 页面用
private, must-revalidate,禁止 CDN 缓存,强制每次验证 freshness - API 响应(JSON/XML)通常不设 Cache-Control,或设
no-cache,靠 ETag/Last-Modified 验证 - 优先用
add_header Cache-Control ...而非expires,前者支持更多指令且更可控











