Nginx记录非法请求日志的核心是通过map模块匹配URI、User-Agent、HTTP方法等特征标记非法请求,再结合if条件将匹配项单独写入自定义格式的illegal_access.log文件,实现精准捕获与审计溯源。

在 Nginx 中记录非法请求日志,核心是识别“非法请求”并将其单独记录——比如恶意扫描、SQL 注入、路径遍历、User-Agent 异常、未授权访问等。Nginx 本身不内置入侵检测能力,但可通过 条件匹配 + 自定义日志格式 + 单独日志文件 实现有效捕获。
识别非法请求的关键字段
常见非法特征可从请求头、URI、参数、方法中提取:
-
URI 中含危险字符或路径:如
../、etc/passwd、phpinfo()、union select -
请求参数含 SQL/命令注入关键词:如
select\+from、exec%20、base64_decode -
User-Agent 异常:空 UA、含
sqlmap、nmap、dirbuster等工具名 -
HTTP 方法异常:非预期的
PUT、DELETE、TRACE(尤其对静态资源) - Referer 或 Host 异常:伪造 Host、空白 Referer(部分爬虫/扫描器特征)
用 map 模块标记非法请求
Nginx 的 map 指令可在请求处理早期打标,开销低且支持正则。推荐在 http 块中定义:
map $request_uri $is_illegal_uri {
~*\.\./ 1;
~*etc/passwd 1;
~*phpinfo\(\) 1;
~*(select|union|insert|drop|delete|update).*from 1;
~*base64_decode 1;
default 0;
}
<p>map $http_user_agent $is_illegal_ua {
~<em>(sqlmap|nmap|dirbuster|nikto|wget.</em>-U) 1;
~*^$ 1; # 空 UA
default 0;
}</p><p>map $request_method $is_illegal_method {
~(PUT|DELETE|TRACE|HEAD) 1;
default 0;
}</p><p>map $is_illegal_uri$is_illegal_ua$is_illegal_method $log_illegal {
~1 1;
default 0;
}这样,只要任一条件命中,$log_illegal 就为 1,可用于后续判断。
配置独立非法日志格式与输出
定义专用日志格式,包含上下文信息便于分析:
log_format illegal '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time"';
<p>access_log /var/log/nginx/illegal_access.log illegal if=$log_illegal;注意:if=$log_illegal 是关键,只在变量为非 0/空时写入该日志。确保日志目录存在且 Nginx 有写权限。
补充建议与注意事项
仅靠 Nginx 日志识别有局限,需配合其他手段提升效果:
- 避免过度正则:复杂正则会拖慢性能,优先用简单字符串匹配(如
etc/passwd),再辅以少量高效正则 - 结合 real_ip 模块:若前端有 CDN 或反向代理,需先配置
set_real_ip_from和real_ip_header,确保$remote_addr是真实客户端 IP - 定期轮转非法日志:用
logrotate防止单文件过大,例如每日切割、保留 30 天 - 不要依赖日志做实时阻断:Nginx 日志是事后记录,阻断应由 WAF 或
deny/return 403实现,日志用于审计与溯源 - 测试规则有效性:用
curl -A "sqlmap/1.0"或构造含../的请求验证是否写入非法日志


















