海外CDN节点定时清理静态资源缓存全流程
海外CDN节点缓存静态资源可以加速全球访问,但更新资源后缓存未失效就会导致用户看到旧内容。
定时清理缓存能自动让新版本覆盖旧文件。
本文以主流CDN服务商为例(如Cloudflare、AWS CloudFront等),手把手教你在服务器上设置定时清理任务,全程使用API + crontab,无需额外付费工具。
为什么需要定时清理静态资源缓存?
- 资源更新后用户仍加载旧文件:比如网站修改了CSS/JS/图片,CDN节点缓存未过期,用户浏览器拿到旧内容。
- 手动清理繁琐且容易遗漏:每次上线都去后台点清除太麻烦,且容易忘。
- 自动化提升运维效率:设置定时任务后,每天凌晨或发版后自动清理,减少人工疏忽。
- 部分CDN免费版不支持智能Purge:一些免费CDN只有全清功能,定时全清可接受。
准备条件
- 目标CDN的API密钥:Cloudflare用户请在控制台获取Global API Key或API Token(推荐Token,权限更细)。AWS CloudFront需创建IAM用户并授予CloudFront的Purge权限。
- 一台Linux服务器(或任何能跑cron的环境),用于执行定时任务。也可以用宝塔面板的计划任务代替。
- 知晓要清理的资源URL或目录前缀:例如
https://cdn.example.com/static/*,或者直接全站刷新。 - curl和jq工具(一般系统自带curl,jq用于解析JSON响应,可以运行
apt install jq或yum install jq)。
操作步骤:以Cloudflare为例设置定时清理
1. 获取API Token并记录Zone ID
登录Cloudflare控制台,进入My Profile → API Tokens,点击Create Token,选择Edit zone DNS模板,权限选择Zone → Cache Purge → Edit,指定目标域名,生成Token。
记下Token字符串。
在域名仪表盘右侧找到Zone ID,复制备用。
2. 编写缓存清理脚本
在服务器上 /opt/scripts/ 目录创建 purge_cf_cache.sh:
#!/bin/bash
# 清理Cloudflare所有缓存
ZONE_ID="你的ZoneID"
API_TOKEN="你的APIToken"
curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/purge_cache" \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
--data '{"purge_everything":true}'
如需只清理特定文件,将purge_everything改为files,并传入文件URL数组。示例:'{"files":["https://cdn.example.com/style.css"]}'
赋予执行权限:chmod +x /opt/scripts/purge_cf_cache.sh
3. 设置定时任务
运行 crontab -e,添加以下行(每天凌晨4点清理):
0 4 * * * /bin/bash /opt/scripts/purge_cf_cache.sh >> /var/log/purge_cf_cache.log 2>&1
保存退出。
cron会自动执行。
4. 测试执行
手动跑一次脚本看是否成功:
/opt/scripts/purge_cf_cache.sh
如果返回包含 "success": true 的JSON则成功。
常见问题与避坑说明
- API Token权限不足:脚本返回403错误,检查Token权限是否包含Cache Purge。
- 清理频率太高被限流:Cloudflare API每分钟最多30次请求(不同套餐不同),建议每天清理1-2次足够。
- crontab时间不对:注意服务器时区设置,使用
timedatectl检查和调整为UTC或Asia/Shanghai。 - AWS CloudFront需使用CreateInvalidation API:脚本写法和Cloudflare不同,但逻辑一致;注意IAM权限需
cloudfront:CreateInvalidation。 - 全站清理后CDN边缘节点重新回源:若源站性能不够,建议在低峰期清理(如凌晨),避免回源流量突增导致源站压力大。
效果验证方法
- 清理前访问一个静态资源,记录响应头中的
cf-cache-status(Cloudflare) 或x-cache(CloudFront) 状态为HIT。 - 执行清理后再次访问同一资源,状态应变为
MISS或EXPIRED,表示缓存已清除。 - 观察cron日志(
/var/log/purge_cf_cache.log)无错误输出。 - 对于需要验证的零基础用户,也可以直接在浏览器打开开发者工具,查看网络请求的响应头信息。
如果您的CDN服务商(如泽御云提供的综合CDN方案)也提供了API接口,可将上述脚本中的API地址和Token替换为其控制台提供的密钥即可。
不同CDN的API格式略有差异,建议以官方文档为准。
常见问题FAQ
Q:定时清理缓存会不会影响网站访问?
A:不会影响访问,只是清理后首次请求会回源拉取最新版本,响应时间略长几毫秒,但之后又会被缓存。建议在低峰期进行。
Q:我没有Linux服务器,能用宝塔面板设置吗?
A:可以。在宝塔面板的计划任务中选择“Shell脚本”,填入上面的清理命令,设置执行周期即可。
Q:我只想清理某个目录下的文件,怎么做?
A:修改脚本中API请求的JSON,对于Cloudflare使用 "files":["https://cdn.example.com/static/*"](支持通配符),注意通配符仅清除匹配的URL。
Q:API Key泄漏了怎么办?
A:立即在CDN控制台撤销或重新生成Key,并检查日志中是否有异常调用。建议使用限制IP的API Token提高安全性。