识别异常静态请求需结合响应体大小与路径特征,启用$ body_bytes_sent和$request_uri等日志字段,通过日志分析定位带宽大户,再依UA、Referer、IP频次等判断异常并配置valid_referers、limit_req、limit_conn拦截,最后通过动静分离与CDN前置卸载流量。

要识别并拦截针对静态资源的异常巨量请求,关键不是只看请求数量,而是结合响应体大小($body_bytes_sent)与请求路径特征做精准分析——因为一个 10MB 的视频下载请求,比一万个 1KB 的小图请求更消耗带宽。
确保 log_format 包含核心字段
必须启用 $body_bytes_sent(纯响应内容大小)和 $request_uri(标准化路径),同时保留 $http_user_agent、$http_referer 和 $remote_addr 用于溯源。示例配置:
log_format bandwidth_log '$remote_addr $http_x_forwarded_for [$time_local] ' '"$request_method $request_uri $server_protocol" ' '$status $body_bytes_sent "$http_referer" "$http_user_agent"'; access_log /var/log/nginx/access.log bandwidth_log;修改后执行 nginx -s reload,新日志才生效;旧日志无法补出 $body_bytes_sent 值。
用日志快速定位“带宽大户”静态请求
运行以下命令,提取近 24 小时内传输量最高的前 10 个静态资源路径(按 $body_bytes_sent 累加):
- 该命令过滤出成功响应(状态码 2xx)、且路径含典型大文件后缀的记录
- 自动清洗路径(如
/static//video.mp4→static/video.mp4),避免同资源因 URL 冗余被拆散统计 - 输出形如:
284932015 static/downloads/app-v2.4.1.zip
识别异常模式并配置拦截规则
发现高流量静态路径后,进一步检查其请求来源是否可疑:
-
UA 异常:大量
python-requests/2.31、curl/7.81或空白 UA,大概率是脚本批量拉取 -
Referer 缺失或非常规:空 Referer 或来自非业务域名(如
evil-scraping.com),需警惕盗链 -
单 IP 短时高频:同一
$remote_addr在 1 分钟内请求同一个大文件 >5 次,可能是未限速下载器
确认后,可在 server 或 location 块中加入限制:
location ~* \.(mp4|zip|pdf|iso)$ { valid_referers none blocked *.yourdomain.com; if ($invalid_referer) { return 403; }limit_req zone=static_burst burst=3 nodelay; limit_conn addr 2;
}
其中 limit_req 控制单位时间请求数,limit_conn 限制单 IP 并发连接数,配合 valid_referers 可直接阻断非法来源。
补充建议:动静分离 + CDN 卸载
真正降低 Nginx 压力的不是事后拦截,而是前置规避:
- 将
/static/、/uploads/等目录指向独立静态服务器或对象存储(如 OSS/S3),Nginx 仅作反向代理或 302 跳转 - 对视频、安装包等大文件启用 CDN,并配置边缘缓存与 Referer 鉴权,让攻击流量在边缘层就被过滤或限速
- 为静态资源添加
Cache-Control: public, max-age=31536000,减少回源次数
不复杂但容易忽略:一次误配的 log_format,会让所有后续分析失去依据;而一次没验证的限速规则,可能误伤正常用户下载。所以改完务必用 curl 和真实 UA 测试效果。

















