最真实落地的流量异常识别方式是直接分析 Nginx 的 $body_bytes_sent 字段,它反映实际下行字节数;需确认 log_format 显式包含该字段,再用 awk 按 IP、URL 等维度统计并结合业务上下文判断异常。

直接用 $body_bytes_sent 分析 access_log,是识别流量异常最真实、最落地的方式——它不依赖客户端上报或代理层估算,而是 Nginx 实际发出去的字节数,精准反映下行带宽消耗。
确保日志里真有这个字段
很多异常查不出来,第一步就卡在日志没记对。检查你的 log_format 是否显式包含 $body_bytes_sent:
- 默认的
combined格式通常包含它,但别假设,执行nginx -T | grep log_format确认; - 如果缺失,补上并重载:
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
然后在 server 块中指定access_log /var/log/nginx/access.log main;; - 重载后新日志才生效,旧日志无法回填该字段。
快速定位异常流量来源
不用等报表,几条命令就能揪出问题:
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
- 看单个请求是否异常大:
awk '{if($10>5000000) print $0}' /var/log/nginx/access.log | tail -20
($10 是 $body_bytes_sent 在默认格式中的位置,数值单位为字节,5MB 以上值得怀疑) - 按 IP 统计总流出量(最近 1 万行):
tail -n 10000 /var/log/nginx/access.log | awk '{ip[$1]+=$10} END {for (i in ip) if(ip[i]>10000000) print ip[i], i}' | sort -nr - 按 URL 统计总流量(识别被刷的大文件或接口):
awk '{url[$7]+=$10} END {for (i in url) if(url[i]>5000000) print url[i], i}' /var/log/nginx/access.log | sort -nr | head -10
区分“合理高流量”和“真实异常”
大流量不等于问题,关键看上下文:
- 静态资源(如视频、安装包)本身体积大,但请求频率低、User-Agent 合理、Referer 可信 → 属于正常业务;
- 同一 IP 短时间高频请求相同大文件,或 User-Agent 是爬虫/扫描器,或 Referer 为空且请求路径可疑(如
/backup.zip、/wp-config.php)→ 高风险; - 某站点突然占总流量 80% 以上,而历史占比长期低于 5%,且无运营活动配合 → 异常信号明确。
进阶:自动捕获突刺并告警
手动查日志只能救火,要提前预警得加一层逻辑:
- 用脚本每分钟统计各
$host的$body_bytes_sent总和,对比前 5 分钟均值; - 若某 host 流量突增 300% 且绝对值超 1MB/s,触发钉钉/企业微信告警;
- 同时输出对应时间段 top 3 异常 IP 和 URI,附在告警消息里,缩短排查时间。
不复杂但容易忽略。核心就三点:日志字段得有、分析维度要准、判断标准得结合业务。

















