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 与过期策略决定命中率与正确性。