构建高内聚图片cdn的关键是三层各司其职:边缘层就近缓存无参静态图并设长ttl;中心层处理带参请求、动态裁剪与格式转换;源站仅提供原始素材且禁用缓存。三层通过请求头协同,避免缓存重叠与穿透。

构建高内聚的行业通用图片 CDN 节点,关键不是堆代理层数,而是让每层各司其职、缓存不重叠、失效可协同。Nginx 多级代理缓存系统的核心价值,在于把“边缘响应速度”和“源站稳定性”同时拉到最优——边缘层扛住 90%+ 图片请求,中心层做策略兜底与动态裁剪,源站只处理真正不可缓存的原始素材。
边缘层:就近缓存,只存确定性资源
部署在区域机房或云边缘节点,面向终端用户。它不处理逻辑,只做高速响应:
- 缓存对象严格限定为无状态静态图片:.jpg/.png/.webp/.avif,不含查询参数(如 ?width=200)的原始路径优先缓存
- 设置长 TTL:proxy_cache_valid 200 302 7d;配合 inactive=7d,确保冷图自动清理,避免磁盘淤积
- 禁用 Cookie 和语言头参与缓存键:proxy_cache_key "$scheme$host$request_uri",防止同一张图因登录态或 UA 差异生成多份副本
- 启用 proxy_cache_use_stale error timeout http_500-504,网络抖动时仍返回旧图,保障页面渲染不中断
中心代理层:带逻辑的中间缓存与标准化出口
位于骨干网枢纽(如华东/华北/华南中心机房),承担边缘层无法完成的“轻计算”任务:
- 接收带参数的图片请求(如 /img/logo.png?w=300&h=200&fit=cover),调用 ImageMagick 或 Thumbor 做实时裁剪压缩,结果再缓存
- 缓存键包含关键参数:proxy_cache_key "$host$request_uri$args",但排除非标准参数(如 utm_source),用 map 指令预处理 $args
- 对源站图片做统一格式转换(如 WebP 降级 fallback)、水印注入、防盗链校验(Referer + Token),这些逻辑不在边缘层重复执行
- 配置 proxy_cache_lock on; proxy_cache_lock_timeout 2s,防止高并发下同一张图被多次回源生成
源站层:只管原始资产,不做任何缓存决策
源站 Nginx 不开启 proxy_cache,仅作为内容权威提供者,职责极简:
- 只响应原始未加工图片(/origin/logo.png),不响应带参 URL;所有加工请求均由中心层发起
- 返回标准 Cache-Control: public, max-age=31536000(1年),但中心层和边缘层均 ignore_headers Cache-Control,完全由自身 proxy_cache_valid 控制生命周期
- 通过 X-Forwarded-For 和自定义头(如 X-From-Center: true)识别中心层回源请求,拒绝直接来自公网的 /origin/ 路径访问
- 启用 gzip_static on; 提前生成 .gz 文件,降低 CPU 压缩开销,提升原始图吞吐
跨层协同:避免缓存污染与穿透
三级之间靠头信息和策略隔离,而非物理隔离:
- 边缘层回源时加 X-From-Edge: true;中心层收到该头,跳过自身缓存逻辑,直连源站——防止同一张图在两级都被缓存两份
- 中心层回源时加 X-From-Center: true;源站据此关闭日志记录、限流宽松,且不返回 Set-Cookie 等干扰头
- 所有层统一使用 proxy_cache_path 的 levels=1:2 keys_zone=pic_cache:200m max_size=10g use_temp_path=off,保证缓存目录结构一致、共享内存区兼容
- 缓存清理不依赖 purge 接口,而是用 inactive + proxy_cache_valid 组合实现自动老化,运维只需定期 df -h 监控磁盘,无需手动干预











