事情本身不复杂,线索都在日志里。图片全部放对象存储后,CDN 回源比例高达 60%,每月回源流量 4TB,账单里回源费用占了大头,缓存命中率只有 35%。
这类报错背后常见的原因有几处,逐个排除就行。缓存键里带了随机参数,同一张图每次都是新地址。另一种情况是源站没输出 Cache-Control,CDN 按默认短 TTL 处理。
另外,图片做了防盗链校验,CDN 回源请求缺少 Referer 被判 403 后不缓存。
算命中率与回源占比
awk '{print $9}' access.log | sort | uniq -c | sort -nr | head -3
给对象存储桶加长缓存元数据
aws s3 cp s3://my-bucket/uploads/ s3://my-bucket/uploads/ --recursive --metadata-directive REPLACE --cache-control "public, max-age=31536000"
等前面都确认过,再确认防盗链白名单包含 CDN 回源 IP
curl -sI -H "Referer: https://www.example.com/" https://static.example.com/a.jpg | head -2
手上没有现成的复现脚本,就照着线上请求手工拼了一个。
改完先别撤,确认这几项。缓存命中率升到 90% 以上,回源流量降到每月 400GB 以内,账单里回源费用下降八成,图片加载时间同步缩短。
容易忽略的是,对象存储的缓存头要写在对象元数据里,改 CDN 规则只能兜底,源站那一层不改永远命中不了。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
