回源率 = nginx 收到的静态资源请求数 ÷ cdn 报告的静态资源总请求数;需通过 location 隔离静态路径、独立日志、cdn 标识变量及交叉验证确保统计准确。

要监控静态资源在 CDN 加速下的回源率,核心是区分“CDN 缓存命中”和“CDN 回源请求”,而 Nginx 作为源站,只能看到被回源的那部分请求。因此,回源率 =(Nginx 收到的静态资源请求数)÷(用户端发起的全部静态资源请求数)。后者无法直接由 Nginx 获取,需借助 CDN 提供的回源日志或控制台数据;前者则可通过 Nginx 精准采集并关联标识。
只记录真实回源请求,避免统计污染
Nginx 默认日志混杂所有流量,必须隔离出「被 CDN 回源触发」的请求:
- 用
location精准匹配静态路径,例如:location ~* \.(js|css|png|jpg|woff2)$ { ... }或location /static/ { ... } - 在该 location 块中启用独立 access_log,不复用主日志;同时关闭无关模块(如 gzip、access_log off 可选)减少干扰
- 通过
set_real_ip_from+real_ip_header正确识别 CDN 回源 IP,并在日志中记录$remote_addr和$http_x_forwarded_for,用于比对 CDN 回源段
添加回源标识字段,明确来源性质
仅靠 IP 不足以 100% 判定是否为 CDN 回源,建议在日志中显式标记:
- 在 http 块定义变量,例如:
map $http_user_agent $is_cdn_origin { "~*Aliyun" "1"; "~*Cloudflare" "1"; default "0"; } - 或检查 CDN 特有 header(如
X-Cdn-Request、X-Forwarded-For中是否含已知 CDN 段),用if或map设置$req_source变量 - 在自定义 log_format 中加入该变量,例如:
log_format cdn_origin '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $is_cdn_origin $request_time';
交叉验证回源率:Nginx 日志 + CDN 控制台
单靠 Nginx 无法算出完整回源率,但可提供关键分子(实际回源数),需与 CDN 数据分母联动:
- 从 CDN 控制台导出指定周期内「静态资源总请求数」和「回源请求数」(阿里云/腾讯云/Cloudflare 均支持)
- 从 Nginx 日志提取同一时段、同一路径前缀的请求数(用
awk '/GET.*\.js/ {count++} END{print count}' static_access.log类命令) - 若两者数量基本一致,说明 Nginx 日志已覆盖绝大多数回源行为;若 Nginx 数显著偏少,需检查是否漏放行 CDN IP 段或日志未生效
- 回源率 ≈ Nginx 统计请求数 ÷ CDN 报告回源请求数(理想应接近 100%,偏低说明部分回源未打到该 Nginx 实例)
辅助判断回源异常的信号
即使不计算精确比率,也能从 Nginx 日志发现回源率突变的线索:
-
$upstream_response_time明显升高且集中出现在某几个$upstream_addr→ 对应 CDN 节点频繁回源或回源慢 -
$status中 502/504 比例上升 → CDN 回源失败率高,可能触发重试导致回源放大 - 同一资源 URL 的
$request_time波动剧烈,但$upstream_response_time稳定 → 可能 CDN 边缘节点缓存失效策略过激,导致本可命中的请求也回源











