静态资源CDN海外节点缓存清理定时任务配置详解
为什么要给海外节点配置缓存清理定时任务
如果你的网站使用CDN加速全球访问,静态资源(如图片、CSS、JS)会被缓存到海外节点。
当资源更新后,旧缓存会导致海外用户访问到过期内容。
手动一个个节点清理太麻烦,配置一个定时任务自动清理海外节点缓存才是省心方案。
准备工作:获取CDN API密钥
无论你用阿里云还是腾讯云,都需要创建API密钥用于调用清理接口。
阿里云CDN
- 登录阿里云控制台,鼠标悬停右上角头像,点击 AccessKey管理。
- 创建 AccessKey ID 和 AccessKey Secret,保存到本地。
- 在 CDN 控制台找到要清理的域名ID(也叫“加速域名”)。
腾讯云CDN
- 打开腾讯云控制台,进入 访问管理 > 访问密钥 > API密钥管理。
- 新建密钥,获取 SecretId 和 SecretKey。
- 在 CDN 控制台找到对应的域名。
安全提示:密钥权限建议只授予CDN缓存清理的最小权限,不要使用主账号密钥。
编写自动清理脚本
以Linux环境为例,使用Python脚本调用CDN API。
下面给出阿里云的示例(腾讯云逻辑类似,仅API地址和参数不同)。
阿里云Python脚本
#!/usr/bin/env python3
import json
import urllib.request
import urllib.parse
import hmac
import hashlib
import base64
import time
import random
import string
# 配置信息
access_key_id = '你的AccessKeyId'
access_key_secret = '你的AccessKeySecret'
domain_name = '你的加速域名' # 例如 static.example.com
region = 'cn-hangzhou'
object_path = '/' # 要清理的路径,/ 表示全部
# 阿里云CDN清理缓存API参数
params = {
'Action': 'RefreshObjectCaches',
'ObjectPath': object_path,
'ObjectType': 'File',
'Format': 'JSON',
'Version': '2018-05-10',
'AccessKeyId': access_key_id,
'Timestamp': time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()),
'SignatureMethod': 'HMAC-SHA1',
'SignatureVersion': '1.0',
'SignatureNonce': ''.join(random.choices(string.ascii_letters + string.digits, k=16))
}
# 计算签名
sorted_params = sorted(params.items(), key=lambda x: x[0])
canonicalized_query = '&'.join([f'{k}={urllib.parse.quote(str(v), safe="")}' for k, v in sorted_params])
string_to_sign = f'GET&%2F&{urllib.parse.quote(canonicalized_query, safe="")}'
signature = base64.b64encode(hmac.new((access_key_secret + '&').encode('utf-8'), string_to_sign.encode('utf-8'), hashlib.sha1).digest()).decode('utf-8')
# 完整URL
url = f'http://cdn.aliyuncs.com/?{canonicalized_query}&Signature={urllib.parse.quote(signature, safe="")}'
try:
response = urllib.request.urlopen(url, timeout=10)
result = json.loads(response.read().decode())
print('清理成功,返回结果:', json.dumps(result, ensure_ascii=False))
except Exception as e:
print('清理失败:', str(e))
将脚本保存为 cdn_clean.py,赋予执行权限:
chmod +x cdn_clean.py
腾讯云脚本简要说明
腾讯云使用 tecentcloud-sdk-python 调用,可参考以下思路:
- 安装 SDK:
pip install tencentcloud-sdk-python - 导入
cdn_client和RefreshCdnUrl/RefreshCdnDir接口。 - 用 SecretId 和 SecretKey 初始化客户端,调用
RefreshCdnDir清理目录。
设置Linux定时任务(cron)
利用系统cron实现每天凌晨自动清理(可自定义频率)。
- 编辑crontab:
crontab -e
- 添加一行(每天凌晨2点执行):
0 2 * * * /usr/bin/python3 /path/to/cdn_clean.py >> /var/log/cdn_clean.log 2>&1
- 路径请替换为你的实际路径。
- 日志文件确保有写权限。
- 保存退出,查看cron是否生效:
crontab -l
如果想每2小时清理一次:0 */2 * * *,根据需求调整。
避坑指南与高频问题
1. 权限不足
- 错误:“Forbidden”或“Access Denied”。
- 解决:检查API密钥是否绑定了CDN权限,或密钥已被禁用。
2. 清理频率太高被限流
- 阿里云/腾讯云API都有QPS限制(通常20-50次/秒)。
- 避免每分钟都跑,至少间隔30分钟。
3. 海外节点与国内节点申请不同API?
- 大部分CDN厂商统一API,指定域名即可,无需区分节点区域。
- 如果需要单独指定区域,查看API文档是否支持
Area参数。
4. 脚本运行正常但缓存没更新?
- 可能清理只针对文件路径,但实际缓存层有CDN边缘节点和内部节点,需等5-10分钟生效。
- 或者检查是否开启了HTTPS,部分厂商要求用相同协议调用。
效果验证
- 查看脚本日志
cat /var/log/cdn_clean.log,确认返回状态码。 - 在CDN控制台的“刷新预热”历史中查看任务记录。
- 用在线工具(如
curl -I https://你的域名/静态文件)对比清理前后X-Cache头部,从HIT变为MISS说明生效。 - 清一下自己本地DNS缓存,再访问海外节点测试。
如果你用的是其他CDN厂商(如Cloudflare、AWS CloudFront),原理相同:获取API凭证 -> 调用刷新接口 -> 配置cron。
关键在于理清API调用的具体参数和签名方式。
遇到问题先回看上面的避坑点,再检查脚本和定时任务是否正常启动。
掌握这套流程后,你可以轻松管理任意CDN的海外节点缓存清理任务。