Nginx 动静分离怎么做?静态缓存与代理缓存配置要点有哪些?

结论先行:动静分离 = 静态资源交给 Nginx/OSS/CDN,动态请求反代给应用,让应用进程只忙业务;配置要点是 location 精确分流、静态文件开启 expires/gzip 与浏览器缓存、动态接口做 proxy_cache 时必须设计好 key 与失效策略。

一、动静分离的拓扑

客户端 → Nginx
          ├── /static/、/assets/ → 磁盘静态文件(可再叠 CDN)
          ├── /api/             → 后端应用集群
          └── proxy_cache 命中   → 直接返回

二、location 分流要点

  • 静态 location 用正则/后缀匹配:~* .(css|js|png|jpg|svg|woff2)$。
  • 动态 location 精确走 /api/、/user/ 等前缀,交给 proxy_pass。
  • 静态文件开启 sendfile、gzip、expires;文件名带 hash(app.abc123.js)可配长期缓存。

三、关键配置片段

# 静态:浏览器缓存 7 天,带 hash 的文件可设 1 年
location ~* \.(css|js|png|jpg|svg|woff2)$ {
    root  /data/www/static;
    expires 7d;
    add_header Cache-Control "public";
    gzip on; gzip_types text/css application/javascript image/svg+xml;
}

# 动态:上游代理缓存(可选)
proxy_cache_path /data/nginx_cache levels=1:2 keys_zone=api:10m
                 max_size=1g inactive=10m;
location /api/ {
    proxy_pass http://backend;
    proxy_cache api;
    proxy_cache_key "$host$request_uri";     # key 设计影响命中率
    proxy_cache_valid 200 1m;                # 过期即回源
    proxy_cache_use_stale error timeout;     # 源站抖动时允许用旧缓存
}

四、易错点清单

  • key 漏掉查询参数会导致不同用户串数据;登录态接口不要缓存或按用户分 key。
  • 缓存时间过长:数据变了用户还拿旧值,要用版本号或主动 purge。
  • 静态与动态混在同一目录:正则顺序写错,动态请求可能被静态 location 吃掉。
  • 忽略 CDN 层:Nginx 命中率再高也不如 CDN 扛流量,动静分离常与 CDN 配合。

常见追问与记忆点

  • 追问:proxy_cache 与 expires 的区别?expires 管浏览器/CDN 侧缓存,proxy_cache 是 Nginx 自身的上游缓存,可叠加。
  • 追问:缓存目录膨胀怎么办?设 max_size 与 inactive,配合过期清理与命中率监控。
  • 记忆点:动静分离保应用,缓存分级(浏览器 → CDN → Nginx → 应用),key 与过期策略决定命中率与正确性。
笔记加载中…