Nginx边缘缓存的核心是补CDN短板,实现分层协作:CDN负责广度缓存静态资源,Nginx专注精度缓存动态接口、登录态页面及差异化内容,并通过proxy_cache_key、cache_lock、use_stale等机制保障高可用与精准控制。

用 Nginx 做边缘缓存,核心不是取代 CDN,而是补它的短板:CDN 覆盖不到的区域、回源策略不灵活的场景、或需要更精细控制缓存生命周期的业务。关键在于让 Nginx 反向代理层承担“最后一公里”的缓存决策权,与 CDN 形成分层协作。
明确缓存层级职责:CDN 做广度,Nginx 做精度
CDN 节点通常离用户近、节点多,适合缓存静态资源(如 JS/CSS/图片)和高命中率内容;而 Nginx 部署在应用服务器前或区域网关,更适合缓存动态接口响应、带用户身份特征的页面(如登录态首页)、或需按请求头/参数差异化缓存的内容。
- CDN 配置建议关闭对 /api/、/user/ 等路径的缓存,或设极短 TTL(如 1s),交由 Nginx 决策
- Nginx 的 proxy_cache_key 应包含 $scheme$host$request_uri$http_cookie$http_accept_language,实现登录态与语言版本隔离缓存
- 避免 CDN 和 Nginx 对同一资源重复缓存——可在 CDN 回源请求头中添加 X-From-CDN: true,Nginx 根据该头跳过本地缓存逻辑(如 set $skip_cache "1")
用 proxy_cache 实现可落地的本地缓存策略
Nginx 缓存不是开个开关就行,必须配合内存+磁盘两级管理、主动刷新机制和错误降级逻辑。
- 定义缓存区:proxy_cache_path /var/cache/nginx/api_cache levels=1:2 keys_zone=api_cache:100m max_size=5g inactive=60m use_temp_path=off; —— 注意 inactive 控制未被访问的缓存存活时间,比 expires 更可靠
- 对 API 接口启用缓存时,用 proxy_cache_valid 200 302 10s; 设基础有效期,再配合 proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; 保证服务降级可用
- 利用 proxy_cache_lock on; 防止缓存失效瞬间的“缓存击穿”,但需搭配 proxy_cache_lock_timeout 3s; 避免长尾请求阻塞
动态内容缓存:绕过 Cookie,但保留必要上下文
很多接口返回内容其实和登录态弱相关(比如用户偏好设置),直接缓存会出错;全不缓存又浪费。折中方案是剥离敏感字段,缓存“骨架”。
- 用 map 指令提取请求中的非敏感标识:map $http_user_agent $cache_key_base { default $host$request_uri; ~*WeChat $host$request_uri"_wechat"; }
- 对含 Authorization 或 sessionid 的请求,用 proxy_ignore_headers Set-Cookie; 并清除响应头中的 Set-Cookie,防止污染缓存
- 结合 add_header X-Cache-Status $upstream_cache_status; 暴露命中状态,便于前端或监控系统识别是否走缓存
与 CDN 协同的关键细节:缓存穿透防护与灰度验证
单靠 Nginx 缓存不能解决所有问题,必须和 CDN 共同构建防御链。
- 在 Nginx 层加简单限流:limit_req zone=api burst=10 nodelay; 防止缓存失效后突发流量打垮上游
- 灰度发布缓存策略:用 geo 或 map 根据 IP 段或请求头控制部分流量进入缓存区,例如只对内网或特定 UA 开启 proxy_cache api_cache;
- CDN 回源时带上 X-Real-IP 和 X-Forwarded-For,Nginx 用 real_ip_header X-Forwarded-For; 获取真实客户端 IP,用于地理缓存或风控联动

















