Nginx需通过log_format显式记录$http_user_agent以识别爬虫;再结合map匹配恶意UA特征、limit_req限流拦截,并辅以日志分析与多维校验构建反爬体系。

在 Nginx 中,通过 log_format 记录 $http_user_agent 是识别爬虫行为的第一步;但仅记录还不够,需结合日志分析与条件限流/拦截,才能真正实现监控与防御。
在 log_format 中正确引入 $http_user_agent
Nginx 默认不记录 User-Agent,需手动扩展日志格式。推荐在 http 块中定义带 UA 的日志格式:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';注意几点:
-
$http_user_agent区分大小写,必须严格按此书写(不是$user_agent或$http_UA) - 建议保留引号包裹,避免 UA 中空格或特殊字符截断日志字段
- 若使用 JSON 格式日志(如对接 ELK),可用
escape=json防止注入:"\"$http_user_agent\"" escape=json
识别异常爬虫的关键 UA 特征
单纯记录 UA 没有意义,需建立识别规则。常见异常信号包括:
- 空白或极简 UA:如
-、curl/7.68.0、python-requests/2.*(无业务标识) - 高频伪装主流浏览器:如
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36,但来自同一 IP 短时发起数百次请求 - 已知恶意爬虫标识:如
sqlmap、dirbuster、Hakai、ZmEu、masscan - UA 中含扫描器关键词:如
scan、spider(非正常搜索引擎)、exploit、bot(非白名单 Bot)
用 map + limit_req 实现轻量级实时拦截
不依赖外部组件,Nginx 原生即可对可疑 UA 做速率限制或直接拒绝:
map $http_user_agent $is_bad_bot {
default 0;
"~*sqlmap" 1;
"~*dirbuster" 1;
"~*ZmEu" 1;
"~*masscan" 1;
"~*nikto" 1;
"~*wpscan" 1;
"~*(libwww|perl|python-requests|curl)/" 1;
"~*^[[:space:]]*$" 1;
}
<p>limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
limit_req_zone $is_bad_bot zone=badbot:1m rate=1r/m;</p><p>server {
location / {
limit_req zone=perip burst=20 nodelay;
limit_req zone=badbot burst=1 nodelay;
limit_req_status 429;
...
}
}说明:
-
map将 UA 映射为 0/1 标签,供后续限流模块使用 -
badbot区域设为极低速率(1 请求/分钟),实际等同于拦截 -
burst=1 nodelay允许首请求通过,便于日志留痕;第二请求即返回 429 - 搭配
limit_req_status 429可统一响应码,方便 WAF 或监控系统聚合
配合日志分析做持续运营
记录只是起点,需让日志“说话”:
- 用
awk快速统计高频异常 UA:awk '$12 ~ /"sqlmap|ZmEu|masscan/' /var/log/nginx/access.log | awk '{print $12}' | sort | uniq -c | sort -nr - 接入 Prometheus + nginxlog_exporter,将 UA 分类(正常/白名单 Bot/可疑/恶意)作为指标暴露
- 在 Grafana 中配置告警:当“恶意 UA 请求占比 > 5% 且 QPS > 50”时触发通知
- 定期更新
map规则——可将 UA 黑名单抽离为独立文件,用 include 引入,支持热 reload
不复杂但容易忽略:User-Agent 可被任意伪造,所以它只能作为初级过滤信号。务必叠加 IP 频率、请求路径规律(如遍历 /wp-admin/、/phpmyadmin/)、TLS 指纹等维度,才构成有效反爬体系。


















