CDN 回源流量异常升高的排查步骤

CDN 回源流量突然升高时,应先判断是业务真实增长、缓存失效、攻击请求、文件传输放大还是统计口径变化。本文以故障处理时间线为主线,说明如何止损、取证、定位、验证和安全回滚。

CDN 回源流量异常升高的排查步骤
封面图:ZuCDN · ZuCDN 原创

源站带宽突然打满,而 CDN 下行流量并没有同比例增长,这类告警需要立即处理。贸然清空缓存、重启 Nginx 或封禁大片 IP,可能让回源流量进一步放大。更可靠的处理顺序是先保护源站,再保存证据,然后判断流量从哪里来、为什么绕过缓存。

告警后的前十分钟

先核对异常是否真实存在。对比 CDN 回源字节数、回源请求数、源站网卡流量和 Web 服务日志。如果只有控制台某个图表上升,而源站网卡与日志没有对应变化,可能是统计延迟、计费口径调整或时间区间不一致。如果回源请求数变化不大但字节数猛增,应优先检查大文件、Range 请求和压缩差异;如果请求数暴增而单次响应很小,更像缓存绕过、爬虫、攻击或接口流量。

此时不要执行全站缓存刷新。缓存刷新会主动制造大面积 MISS,与故障现象叠加后更难判断。可以暂时冻结发布任务、自动刷新脚本和大文件分发任务,记录操作时间。若源站已接近容量上限,应利用现有 CDN 或防火墙能力对明确异常的路径限速、鉴权或临时阻断,但不要虚构规则效果,也不要在没有样本的情况下按 User-Agent 大范围封禁。

建立一张故障快照

建议记录异常开始时间、受影响域名、回源协议、源站地址、峰值带宽、请求量、主要状态码、缓存状态、URL 排名、客户端地区以及最近一次配置或发布变更。时间统一到同一时区,至少保留异常前后各一个可比较窗口。没有这张快照,后续很容易把恢复后的低流量误当成修复结果。

宝塔 Nginx 站点日志通常位于 /www/wwwlogs/。下面的命令适用于 Linux 与宝塔 Nginx,作用是确认日志文件并统计近期请求路径。它们只读取文件,但大日志上的排序会消耗 CPU、内存和磁盘读取能力,生产高峰应缩小行数或复制日志后离线分析。

ls -lh /www/wwwlogs/
tail -n 50000 /www/wwwlogs/example.com.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -30

验证时检查排名靠前的路径是否与 CDN 控制台的回源 URL 一致,并留意查询参数是否让同一路径被拆散。命令未修改文件,无需回滚;若资源占用升高,终止命令即可。日志格式经过自定义时,$7 未必是请求 URI,应先用 head 查看一行结构,不要机械套用字段位置。

沿着四条分支定位

分支一:大量请求变成 MISS 或 EXPIRED

检查异常前是否执行过全站刷新、调整缓存键、缩短 TTL、切换域名、启用随机版本参数,或发布了大量新 URL。节点扩容、流量调度变化也可能让请求落到冷节点,但需要结合 CDN 提供的节点和缓存状态信息判断,不能仅凭一次 curl 得出结论。

抽取高流量静态 URL 连续访问,观察 Age、Cache-Control、Vary、Set-Cookie 和缓存状态。若每次都是 MISS,继续从源站响应头和 CDN 缓存规则查找不缓存原因。若第一次 MISS、后续 HIT,而全局回源仍高,问题可能是 URL 离散度过高或访问分散,不一定是缓存写入失败。

分支二:BYPASS 与动态请求增加

WordPress 登录、后台、预览、搜索、购物车和个性化接口通常需要回源。异常流量若集中在 /wp-login.php/wp-admin//wp-json/admin-ajax.php 或特定插件接口,应检查访问来源、方法、状态码和响应大小。不能为了降低回源量直接缓存这些路径,否则可能造成权限绕过、数据串用或操作失效。

可用只读命令统计状态码。环境是宝塔 Nginx 的默认或近似 combined 日志格式,作用是寻找错误与重定向放大;风险仍是大文件排序造成资源消耗:

tail -n 50000 /www/wwwlogs/example.com.log | awk '{print $9}' | sort | uniq -c | sort -nr

验证方式是抽样原始日志,确认字段确实为 HTTP 状态码。无需回滚。若出现大量 301、302,要检查 CDN 回源协议、Host 和源站强制跳转是否形成重复请求;大量 404 可能来自扫描或错误资源地址;大量 5xx 则可能让 CDN 无法保存响应,并触发客户端重试。

分支三:请求数平稳,回源字节数上升

这种模式要关注视频、安装包、备份文件和图片原图。Range 请求可能只向用户发送一段内容,却因配置或源站行为导致 CDN 多次取回较大区间。大文件没有 Content-Length、源站不正确支持 Range、对象在传输中断后重复拉取,也可能放大流量。

使用响应头检查文件长度、Accept-Ranges、Content-Range 和压缩协商。以下命令适用于 Linux,作用是发起一个小范围读取请求;风险是目标服务器可能忽略 Range 并返回完整文件,因此应选择可控对象,并使用输出丢弃和超时限制。

curl -sS --max-time 15 -H 'Range: bytes=0-1023' -D - -o /dev/null https://www.example.com/files/sample.zip

验证标准是状态码与 Content-Range 符合预期,同时对照源站日志中的实际发送字节。该命令不修改配置,停止请求即可回滚影响。不要对未知超大文件反复测试。

分支四:攻击、盗链或来源绕过

若异常集中在少数资源、Referer 异常、请求来源高度集中,可能是盗链或恶意下载;若源站公网 IP 被直接访问,则这些流量甚至没有经过 CDN。检查源站日志中的 Host、来源地址以及云平台或系统网卡统计,确认请求究竟来自 CDN 回源节点还是外部客户端。

源站只允许可信 CDN 回源地址是一种常见防护思路,但执行前必须确认官方地址段可自动更新,并保留管理、监控、证书验证和容灾入口。错误的白名单会直接中断业务。不要根据搜索结果或历史工单复制一份过期 IP 列表,也不要在 SSH 来源不明确时修改系统防火墙。

把最近变更放回时间线上

回源异常常与配置变更有关,包括缓存规则优先级调整、源站 Host 修改、HTTP 与 HTTPS 回源切换、忽略参数策略变化、证书故障、WAF 规则、WordPress 插件升级和发布系统执行刷新。将每项变更时间与流量拐点对齐,比逐个猜测更有效。

检查宝塔 Nginx 配置可执行:

/www/server/nginx/sbin/nginx -T 2>/dev/null | grep -nE 'server_name|proxy_pass|proxy_set_header[[:space:]]+Host|return[[:space:]]+30[1278]'

环境要求是宝塔安装的 Nginx,作用是查看生效配置中的域名、上游、回源 Host 和跳转;风险是输出包含内部地址,不应公开传播。验证时将结果与 CDN 源站配置逐项核对。命令只读,无需回滚。路径不存在时通过宝塔面板确认 Web 服务类型。

修复后的验证窗口

修复动作应一次只处理一个主要假设。恢复误改的缓存规则后,观察 MISS、HIT、BYPASS 比例和源站带宽是否同步变化;阻断异常路径后,确认正常页面、搜索引擎、API 和管理端没有受到影响;修正 Range 或大文件策略后,使用受控请求比较 CDN 下行字节与源站发送字节。

验证至少包含四组信号:CDN 回源请求与流量下降,源站 CPU、连接数和网卡恢复,用户侧状态码与延迟正常,内容和登录态没有错误。只看到带宽下降并不充分,因为过度封禁同样能制造一条漂亮的下降曲线。

常见误操作与回滚

  • 全站清缓存:会形成缓存雪崩。回滚方式不是再次刷新,而是停止刷新任务,对高热静态资源按业务优先级预热,并监控源站容量。

  • 缓存所有动态页面:可能泄露用户数据。发现登录态或个性化内容被缓存时,应立即恢复绕过规则,对相关 URL 精准清理,并验证未登录与多个测试账号的响应隔离。

  • 直接封禁来源 IP:可能误伤 CDN 回源节点或共享出口。应恢复防火墙规则,根据官方地址段、路径和速率重新设计限制。

  • 高峰期重启 Nginx:会中断现有连接。配置变更前先执行 /www/server/nginx/sbin/nginx -t,确认通过后优先在宝塔面板重载。若验证失败,恢复 /www/server/panel/vhost/nginx/ 下对应配置的备份,再测试并重载。

故障关闭前,应保存根因、影响窗口、有效证据、修复动作和回滚点,并为缓存命中率、回源字节比、单 URL 回源峰值及源站直连流量设置分层告警。CDN 回源流量异常升高不是一个单纯的带宽问题,它往往是缓存、调度、应用和安全策略之间的联动结果。把证据链保留下来,下一次告警才不需要从猜测重新开始。

延伸阅读