全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-20 7 分钟 ✍️ juanwangdev

缓存配置优化

合理的缓存策略可大幅减少服务器负载、降低带宽消耗并提升用户体验。NGINX 通过 expiresadd_header 指令控制缓存行为。

基础缓存控制

expires 指令

nginx
location /static/ {
    root /var/www/html;
    expires 30d;
    add_header Cache-Control "public, no-transform";
}
  • expires 30d — 设置 Cache-Control: max-age=2592000Expires
  • expires -1 — 禁止缓存
  • expires epoch — 设置为过期时间 1970-01-01
  • expires off — 不修改缓存头

按文件类型设置缓存

不同类型不同策略

nginx
server {
    # 静态资源 - 长期缓存
    location ~* \.(css|js|jpg|jpeg|png|gif|svg|ico|woff|woff2|ttf)$ {
        expires 365d;
        add_header Cache-Control "public, immutable";
    }
    
    # HTML - 短期缓存
    location ~* \.html$ {
        expires 1h;
        add_header Cache-Control "public, no-cache";
    }
    
    # 动态 API - 不缓存
    location /api/ {
        expires -1;
        add_header Cache-Control "no-store, no-cache, must-revalidate";
    }
}

immutable 告诉浏览器在有效期内文件不会变化,刷新页面也不重新验证。适用于文件名带 hash 的构建产物。

条件缓存

按文件命名模式

nginx
location /assets/ {
    # 带 hash 的文件名长期缓存
    location ~* \.[a-f0-9]{8,}\.(css|js)$ {
        expires 365d;
        add_header Cache-Control "public, immutable";
    }
    
    # 普通文件短期缓存
    expires 7d;
    add_header Cache-Control "public";
}

缓存控制头说明

Cache-Control 指令

  • public — 可被任何缓存存储
  • private — 仅浏览器可缓存
  • no-cache — 每次使用需验证 freshness
  • no-store — 不存储任何缓存
  • must-revalidate — 过期后必须验证
  • max-age=3600 — 有效缓存时间(秒)
  • s-maxage=3600 — CDN/代理缓存时间
  • immutable — 有效期内不重新验证

代理缓存控制

控制后端缓存行为

nginx
location /api/ {
    proxy_pass http://backend;
    
    # 忽略后端设置的缓存头
    proxy_ignore_headers Cache-Control;
    proxy_ignore_headers Expires;
    proxy_ignore_headers Set-Cookie;
    
    # 在 NGINX 层强制缓存
    proxy_cache_valid 200 10m;
}

当后端缓存头不合理时,proxy_ignore_headers 可覆盖。注意 Set-Cookie 响应不应被缓存。

ETag 和 Last-Modified

协商缓存配合

nginx
location /static/ {
    etag on;  # NGINX 默认开启
    # 自动基于文件大小和修改时间生成 ETag
    
    expires 1d;
    add_header Cache-Control "public, no-cache";
}
  • no-cache 配合 ETag 实现协商缓存:每次都验证但未过期直接 304
  • 不设置过期时间时浏览器可能无限期缓存

要点总结

  • 静态资源(CSS/JS/图片)设置 30-365 天长期缓存
  • 带 hash 文件名的构建产物使用 immutable 指令
  • HTML 使用短期缓存(1 小时),确保内容更新及时
  • API 响应设置 no-store 禁止缓存
  • Cache-Control 优先级高于 Expires
  • 协商缓存(ETag/Last-Modified)适合需要实时性但可复用的内容

📝 发现内容有误?点击此处直接编辑

← 上一篇 系统内核参数调优
下一篇 → 负载均衡算法调优
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库