静态资源海外CDN节点缓存清理定时任务完整脚本

如果你的站点面向海外用户,CDN节点分布在多个国家,静态资源(图片、CSS、JS)更新后不能及时生效,用户看到的就是旧版本。
手动一个一个刷新URL不但累,还容易漏掉。
正确做法是写一个自动清理脚,然后用Linux的crontab定时执行。
下面以阿里云CDN为例,手把手写出一套完整的定时清理脚本,其他云厂商原理一样,只需替换API接口和认证方式。

为什么需要定时清理海外CDN缓存

海外CDN节点多,各节点缓存TTL(生存时间)可能不一致。
当你更新资源后,虽然手动刷新了国内节点,但海外节点可能还保留旧缓存。
尤其对静态资源,更新频率高(例如每日发布新版本),如果没有定时清理,用户就会看到404或旧内容。
自动化脚本可以每天凌晨低峰期自动清除所有节点缓存,保证全球用户访问的都是最新文件。

准备工作:安装阿里云CLI并配置密钥

脚本需要调用阿里云CDN的OpenAPI,最方便的方式是使用阿里云CLI(命令行工具)。

  1. 安装阿里云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
  1. 配置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点。

  1. 执行 crontab -e(如果是第一次,会提示选择编辑器,选 nanovim)。
  2. 在文件末尾添加一行:
   0 3 * * * /path/to/cdn_refresh.sh >> /var/log/cdn_refresh.log 2>&1
  • 0 3 * * * 表示每天凌晨3点整执行。
  • 后面跟脚本的绝对路径。
  • >> /var/log/cdn_refresh.log 2>&1 将标准输出和错误都追加到日志文件,方便排查。
  1. 保存退出(nano按 Ctrl+X,Y,Enter;vim按 Esc,:wq,Enter)。
  2. 查看定时任务是否生效:crontab -l

验证:手动运行一次脚本:./cdn_refresh.sh,然后查看日志:cat /var/log/cdn_refresh.log

避坑指南(常见问题)

  • Q:脚本执行后返回错误 IncompleteSignatureInvalidAccessKeyId

答: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条。
如果你的资源数超过额度,可以将所有资源路径合并到一个文件里,或者使用通配符刷新(需谨慎,会刷掉整个目录的缓存)。

效果验证

  1. 登录阿里云CDN控制台,进入“刷新预热”页面,可以看到当天的刷新记录(状态“成功”表示已清空缓存)。
  2. 在海外节点地区(比如美国、新加坡)用 curl -I https://yourdomain.com/static/css/main.css 查看响应头中的 X-Cache,如果变为 MISS 表示缓存已重新获取。
  3. 定时任务执行后查看日志 cat /var/log/cdn_refresh.log,确认没有报错。

如果你的CDN是腾讯云、华为云或其他厂商,只需将 aliyun 命令换成对应厂商的CLI或SDK,API参数略有差异,但整体流程完全一致。

现在就去你的服务器上部署这套脚本,再也不用半夜手动刷缓存了。
如果你遇到本教程未覆盖的问题,欢迎在评论区留言,我会持续补充常见场景。

分享到:
上一篇
日志自动清理定时脚本避免磁盘爆满服务器宕机部署
下一篇
容器资源配额限制防止进程耗尽内存CPU资源配置
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意