海外CDN节点缓存清理定时任务脚本怎么写?附完整Shell示
海外CDN节点缓存清理如果不做成定时任务,就只能每天登录控制台手动刷新,费时还容易漏掉新增的URL。
本文用一套可直接复制的Shell脚本和crontab配置,帮你实现按小时自动清理指定的CDN缓存,整个过程不需要懂复杂的编程,照着做就能跑起来。
先搞清楚你要调哪个接口
不同CDN服务商的清理方式不太一样,但主流厂商基本都提供了HTTP API接口。
以常见的海外CDN服务为例,你需要提前拿到三样东西:
- API Key或Token:在CDN控制台的“API管理”或“密钥管理”里生成
- Zone ID或加速域名ID:一般对应你要清理的站点或域名
- 缓存清理接口地址:通常在官方API文档里能找到,比如
purge/cache这类路径
如果你用的是自建边缘节点或开源CDN面板,接口路径会不同,但思路一致:让服务器用自己的身份凭证去请求清理接口,而不是每次都打开网页操作。
编写缓存清理脚本
建议在服务器上新建一个目录专门放运维脚本,避免文件散落。
执行:
mkdir -p /opt/cdn-purge && cd /opt/cdn-purge
创建脚本文件:
vim purge_cdn_cache.sh
按你的实际情况修改下面的示例脚本,把 YOUR_API_KEY、YOUR_ZONE_ID 和接口地址替换成真实值:
#!/bin/bash
# 海外CDN节点缓存清理定时任务脚本
# 用法:手动执行或配合crontab定时运行
API_KEY="YOUR_API_KEY"
ZONE_ID="YOUR_ZONE_ID"
API_URL="https://api.yourcdn.com/v1/zones/${ZONE_ID}/purge_cache"
# 要清理的URL列表,一个URL一行
URLS=(
"https://img.example.com/a.jpg"
"https://img.example.com/b.jpg"
)
# 把URL数组转成JSON格式
PAYLOAD=$(printf '{"urls":[%s]}' "$(printf '"%s",' "${URLS[@]}" | sed 's/,$//')")
# 调用API清理缓存
RESPONSE=$(curl -s -X POST "$API_URL" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d "$PAYLOAD")
# 输出结果到日志
echo "$(date '+%Y-%m-%d %H:%M:%S') $RESPONSE" >> /var/log/cdn_purge.log
# 简单判断请求是否成功
if echo "$RESPONSE" | grep -q '"success":true'; then
echo "CDN缓存清理成功"
else
echo "CDN缓存清理失败,请检查API配置或稍后重试"
fi
保存后给脚本添加执行权限:
chmod +x purge_cdn_cache.sh
先手动运行一次,确认接口能通、日志有输出:
./purge_cdn_cache.sh
看到 CDN缓存清理成功 或日志里有正常返回,就说明脚本本身没问题。
配置定时任务自动执行
打开当前用户的crontab:
crontab -e
如果是第一次编辑,会提示选择编辑器,按 2 选vim即可。
加入下面这行,代表每天凌晨3点执行一次:
0 3 * * * /opt/cdn-purge/purge_cdn_cache.sh >> /var/log/cdn_purge_cron.log 2>&1
如果你想每6小时清理一次,可以改成:
0 */6 * * * /opt/cdn-purge/purge_cdn_cache.sh >> /var/log/cdn_purge_cron.log 2>&1
保存退出后,查看定时任务是否写入:
crontab -l
看到刚才那行就说明配置成功。
注意脚本路径必须写绝对路径,crontab环境变量很少,别用相对路径。
这些坑一定得避开
URL必须和CDN上的缓存Key完全一致。 比如你配置的是HTTPS,就不要写 http:// 开头的地址;
结尾带不带斜杠也要严格匹配,否则清理接口不会报错,但缓存实际没清掉。
脚本里不要硬编码敏感信息到后提交的日志里。 建议把日志里的API Key用 sed 先替换再存储,或者直接在服务器上限制日志文件的读取权限:
chmod 600 /var/log/cdn_purge.log
注意CDN服务商对API调用频率的限制。 部分海外CDN按分钟或按天限制清理请求次数,脚本里如果批量提交太多URL,容易触发限流。
建议每次提交不超过100条,或者分批处理。
crontab里别忘记给脚本执行权限。 如果定时任务不执行,最优先检查的就是这两个命令:
which php
bash -x /opt/cdn-purge/purge_cdn_cache.sh
怎么确认定时清理真的生效
定时任务跑完不要只看日志就完事,还要实际验证缓存是否刷新:
- 在浏览器打开你要清理的URL,按
F12进入开发者工具,切换到Network标签。 - 刷新页面,找到对应的响应请求,查看响应头里的
x-cache或age字段。 - 如果值显示为
MISS或age很小,说明缓存已重新回源,清理成功。
你还可以写一个简单的检查脚本,定时抓取URL响应头并记录状态:
curl -I -s https://img.example.com/a.jpg | head -20
把这条命令加到刚才的脚本后面,就能在清理后自动追踪远端节点的缓存状态。
常见疑问:如果CDN服务商同时有多个海外节点,脚本里的接口会自动广播到所有节点,不需要每个节点单独设置。
如果你用的是国内加海外的混合CDN,记得确认API接口的作用域是否包含全部区域。
另外,定时任务的执行时间尽量放在站点访问低峰期,比如凌晨3点到5点,这样即使清理后有短暂回源,也不会影响访客体验。