CDN日志分析实战 – 定位缓存问题,优化命中率
评测概述
cdn控制台提供的报表有时不够详细。通过分析CDN访问日志,可以定位缓存命中率低、回源过多的问题。本文以又拍云、Cloudflare为例,介绍日志分析方法和常用命令。
一、为什么要分析CDN日志?
CDN报表只能看到整体命中率,无法定位到具体URL、地理区域、时间段的细节。通过日志可以:找出哪些文件从未被缓存;发现某个地区回源过高;排查特定用户代理导致的缓存问题;分析HTTP状态码分布。
二、获取CDN日志
又拍云:控制台「日志分析」中导出,或配置日志推送至对象存储或AWS S3,支持按小时分片。
Cloudflare:免费版可通过「日志分析」或Worker脚本采集;企业版有详细日志。个人站可以用第三方工具如Logflare接入。
阿里云/腾讯云:支持自定义日志字段,推送到自己的服务器分析。
三、常用分析命令
假设日志文件名为cdn.log,字段包括:时间、客户端IP、请求方法、URI、状态码、字节数、缓存状态(HIT/MISS)、Referer、User-Agent。以下命令在Linux环境使用。
1. 查看缓存命中率
awk '{print $NF}' cdn.log | sort | uniq -c
假设最后一列是缓存状态,统计HIT次数占比。
2. 找出回源最多的文件(MISS)
grep "MISS" cdn.log | awk '{print $6}' | sort | uniq -c | sort -nr | head -20
$6是请求的URI。
3. 按地理区域统计回源率(如果有IP映射库)
先用脚本将IP转换为国家代码,再统计。使用开源工具如ip2location。
while read line; do ip=$(echo $line | awk '{print $2}'); country=$(geoiplookup $ip | awk -F: '{print $2}'); echo "$country $(echo $line | grep -q MISS && echo 1 || echo 0)"; done < cdn.log
4. 统计被缓存的状态码
awk '{print $9, $NF}' cdn.log | sort | uniq -c | sort -nr
关注非200但被缓存的响应(如404可能不应缓存)。
四、常见问题与优化建议
问题1:同一资源URL带动态参数导致命中率低
例如 style.css?version=1, style.css?version=2。解决方法:CDN控制台配置“忽略指定参数”(如version)作为缓存键。
问题2:某些地区回源高
可能是CDN在该地区节点少或路由问题。可联系CDN客服调整调度,或考虑增加专用地区加速域名。
问题3:移动端User-Agent导致缓存未命中
部分CDN默认根据User-Agent缓存不同的版本。如果移动端和桌面端返回相同内容,可以关闭“Vary: User-Agent”头。
五、自动分析脚本示例
写一个简单bash脚本,每天自动分析前一天的日志,邮件发送报告摘要。
#!/bin/bash
LOG_FILE="/var/log/cdn/$(date -d 'yesterday' +%Y%m%d).log"
HIT=$(grep -c "HIT" $LOG_FILE)
MISS=$(grep -c "MISS" $LOG_FILE)
TOTAL=$((HIT+MISS))
HIT_RATE=$(echo "scale=2; $HIT*100/$TOTAL" | bc)
echo "CDN Hit Rate: $HIT_RATE%" | mail -s "CDN Report" admin@example.com
添加到cron每天执行。
通过日志分析,可以精准优化缓存策略,降低CDN成本。


