静态资源海外CDN节点缓存清理定时任务完整脚本
如果你的站点面向海外用户,CDN节点分布在多个国家,静态资源(图片、CSS、JS)更新后不能及时生效,用户看到的就是旧版本。
手动一个一个刷新URL不但累,还容易漏掉。
正确做法是写一个自动清理脚,然后用Linux的crontab定时执行。
下面以阿里云CDN为例,手把手写出一套完整的定时清理脚本,其他云厂商原理一样,只需替换API接口和认证方式。
为什么需要定时清理海外CDN缓存
海外CDN节点多,各节点缓存TTL(生存时间)可能不一致。
当你更新资源后,虽然手动刷新了国内节点,但海外节点可能还保留旧缓存。
尤其对静态资源,更新频率高(例如每日发布新版本),如果没有定时清理,用户就会看到404或旧内容。
自动化脚本可以每天凌晨低峰期自动清除所有节点缓存,保证全球用户访问的都是最新文件。
准备工作:安装阿里云CLI并配置密钥
脚本需要调用阿里云CDN的OpenAPI,最方便的方式是使用阿里云CLI(命令行工具)。
- 安装阿里云CLI(选择1)
- 在服务器上运行:
curl -sSL https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz -o aliyun-cli.tgz && tar xzf aliyun-cli.tgz && sudo mv aliyun /usr/local/bin/ - 验证安装:
aliyun --version
- 配置AccessKey
- 登录阿里云RAM控制台,创建子用户,赋予
CDNFullAccess权限(最小可以给cdn:RefreshObjectCaches)。 - 获取AccessKey ID和AccessKey Secret。
- 在服务器上执行
aliyun configure,按提示输入:
Access Key ID [None]: 你的AK
Access Key Secret [None]: 你的SK
Default Region Id [None]: cn-hangzhou (CDN为全球服务,地区随便填)
Default Output Format [None]: json
如果不想交互式配置,也可以直接用环境变量或参数传入,但初学者建议用 aliyun configure 保存。
注意:AccessKey是敏感信息,请妥善保管,不要放入代码仓库。
编写缓存清理脚本
新建文件 cdn_refresh.sh,内容如下:
#!/bin/bash
# 要清理的URL列表,每行一个
URLS=(
"https://yourdomain.com/static/css/main.css"
"https://yourdomain.com/static/js/app.js"
"https://yourdomain.com/static/img/logo.png"
)
# 循环调用阿里云CLI刷新
for url in "${URLS[@]}"; do
echo "Refreshing: $url"
aliyun cdn RefreshObjectCaches --ObjectPath "$url" --ObjectType File --Region cn-hangzhou
if [ $? -eq 0 ]; then
echo "OK: $url"
else
echo "FAIL: $url" >&2
fi
done
脚本说明:
- 将你需要刷新的静态资源URL按行添加到
URLS数组中。 --ObjectType File表示刷新单个文件;如果刷新整个目录(慎用,耗时长)可以用Directory。--Region参数随意,CDN接口全球通用。- 执行前加权限:
chmod +x cdn_refresh.sh。
如果你有大量URL(几百个以上),可以改为从文件读取:
while IFS= read -r url; do
aliyun cdn RefreshObjectCaches --ObjectPath "$url" --ObjectType File --Region cn-hangzhou
done < url_list.txt
设置Linux定时任务(crontab)
脚本写好之后,我们需要让它每天定时执行,比如凌晨3点。
- 执行
crontab -e(如果是第一次,会提示选择编辑器,选nano或vim)。 - 在文件末尾添加一行:
0 3 * * * /path/to/cdn_refresh.sh >> /var/log/cdn_refresh.log 2>&1
0 3 * * *表示每天凌晨3点整执行。- 后面跟脚本的绝对路径。
>> /var/log/cdn_refresh.log 2>&1将标准输出和错误都追加到日志文件,方便排查。
- 保存退出(nano按 Ctrl+X,Y,Enter;vim按 Esc,:wq,Enter)。
- 查看定时任务是否生效:
crontab -l。
验证:手动运行一次脚本:./cdn_refresh.sh,然后查看日志:cat /var/log/cdn_refresh.log。
避坑指南(常见问题)
- Q:脚本执行后返回错误
IncompleteSignature或InvalidAccessKeyId
答:AccessKey配置错误或权限不足。
检查 aliyun configure 中的AK/SK,确保子用户有 RefreshObjectCaches 权限。
- Q:海外节点刷新需要额外配置吗?
答:阿里云CDN默认刷新所有节点(全球),无需单独指定地区。
如果某些区域有独立加速域名,需要单独对所有域名执行刷新。
- Q:刷新一个URL需要多长时间?
答:通常5分钟左右生效,大节点(美国、欧洲)可能延迟稍久。
如果你需要立即生效,可以减少并发数,但不要一次提交太多(建议每次不超过100条)。
- Q:脚本跑完但用户访问还是旧文件?
答:先确认脚本返回了 OK 状态。
如果状态成功,那么等3-5分钟再查;
如果仍然不对,检查服务器响应头是否有 X-Cache 字段,看是否命中CDN。
有时浏览器本地缓存也会干扰,按 Ctrl+F5 强制刷新即可。
- Q:每天的刷新额度有限制吗?
答:阿里云CDN免费额度为每天刷新URL 1000个,限制刷新目录(带目录前缀)10条。
如果你的资源数超过额度,可以将所有资源路径合并到一个文件里,或者使用通配符刷新(需谨慎,会刷掉整个目录的缓存)。
效果验证
- 登录阿里云CDN控制台,进入“刷新预热”页面,可以看到当天的刷新记录(状态“成功”表示已清空缓存)。
- 在海外节点地区(比如美国、新加坡)用
curl -I https://yourdomain.com/static/css/main.css查看响应头中的X-Cache,如果变为MISS表示缓存已重新获取。 - 定时任务执行后查看日志
cat /var/log/cdn_refresh.log,确认没有报错。
如果你的CDN是腾讯云、华为云或其他厂商,只需将 aliyun 命令换成对应厂商的CLI或SDK,API参数略有差异,但整体流程完全一致。
现在就去你的服务器上部署这套脚本,再也不用半夜手动刷缓存了。
如果你遇到本教程未覆盖的问题,欢迎在评论区留言,我会持续补充常见场景。