在自动化部署流水线末尾调用 CDN 厂商提供的刷新预热 API,是解决静态资源更新后用户仍看到旧版本的最直接方案,适合静态资源频繁变动的站点。
先说结论:部署脚本执行完毕后,立即触发 CDN 缓存清除接口。
- 适合:静态资源(CSS/JS/图片)更新频繁的场景
- 先准备:确认 CDN 厂商 API 权限密钥及调用频率限制
- 验收:通过浏览器开发者工具检查响应头中的缓存状态
核心难点:如何自动获取变更文件列表
刷新全量域名成本高且风险大,最佳实践是仅刷新本次部署变更的文件。在 CI/CD 环境中,可以通过 Git 差异对比生成待刷新 URL 列表。
# 获取上一次提交到当前 HEAD 之间变更的文件路径
git diff `--name-only` HEAD~1 HEAD > changed_files.txt
# 过滤出静态资源并拼接为完整 URL (示例为 Bash)
while IFS= read -r file; do
if [[ $file =~ \.(css|js|png|jpg)$ ]]; then
echo "https://example.com/${file}"
fi
done < changed_files.txt > purge_urls.txt厂商接口对接实战
不同 CDN 厂商的认证机制差异较大。Cloudflare 支持直接通过 API Token 调用,而阿里云、腾讯云等国内厂商通常要求复杂的签名算法(HMAC-SHA1),强烈建议使用官方 SDK 而非直接 curl,以免签名错误导致鉴权失败或安全漏洞。
方案 A:Cloudflare (直接 API 调用)
curl -X POST "https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/purge_cache" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
`--data` '{"files": ["https://example.com/style.css"]}'方案 B:阿里云 (Python SDK 示例)
from aliyunsdkcdn.request.v20180510.RefreshObjectCachesRequest import RefreshObjectCachesRequest
from aliyunsdkcore.client import AcsClient
client = AcsClient('', '', 'cn-hangzhou')
request = RefreshObjectCachesRequest()
request.set_ObjectPath(['https://example.com/style.css'])
request.set_ObjectType('File')
response = client.do_action_with_exception(request) CI/CD 流水线集成 (GitHub Actions)
将刷新逻辑封装为独立 Step,确保部署成功后执行。注意将密钥配置为 Repository Secrets。
jobs:
deploy:
steps:
- name: Purge CDN Cache
if: success() && github.ref == 'refs/heads/main'
run: |
python purge_cdn.py
env:
CDN_API_KEY: ${{ secrets.CDN_API_KEY }}
CDN_REGION: cn-hangzhou怎么验证是否生效
1. 检查响应头
使用curl -I命令访问刚更新的资源。观察X-Cache或Cache-Control头。如果显示MISS或bypass,说明请求已回源;如果显示HIT且内容已更新,说明刷新生效。
2. 强制刷新测试
在 incognito(无痕)模式下访问页面,避免本地浏览器缓存干扰。对比源站文件哈希值与 CDN 返回内容是否一致。
3. 查看 CDN 控制台
部分厂商控制台提供“刷新任务”查询页面,可确认任务状态是否为“完成”。
常见坑与风险
1. 接口调用频率限制
不同厂商限流策略差异较大,例如阿里云单用户 QPS 限制通常为 100,具体请查阅对应文档并配置重试机制。如果在短时间内高频部署,可能触发限流导致刷新失败,需实现指数退避重试。
2. 刷新范围过大
尽量刷新具体 URL,不要习惯性地刷新整个域名(Directory 或 Domain 级别)。全量刷新会导致所有节点回源,可能引发源站压力激增甚至被误判为攻击。
3. 密钥泄露风险
CI/CD 日志中严禁打印密钥或完整请求头。确保脚本中涉及认证信息的变量不被echo出来。
4. 签名算法复杂度
国内厂商 API 通常涉及时间戳、nonce 及签名计算,自行实现 curl 请求极易出错。生产环境务必使用官方维护的 SDK,避免手动拼接签名参数。
5. 费用问题
部分 CDN 服务商对 API 刷新操作收费,尤其是高频调用或大目录刷新。建议先确认计费规则,避免产生意外账单。
参考来源
- 阿里云 CDN API 文档 - RefreshObjectCaches,URL: https://help.aliyun.com/zh/cdn/developer-reference/refreshobjectcaches
- 腾讯云 CDN API 文档 - PurgeUrlsCache,URL: https://cloud.tencent.com/document/api/228/17410
- Cloudflare Cache Purge API,URL: https://developers.cloudflare.com/cache/how-to/purge-cache/