Nginx可通过map指令实现按IP动态控制日志记录:①用map+access_log if=$var过滤,使恶意IP不写入主日志;②映射至/dev/null彻底丢弃日志;③分离写入专用日志文件便于审计。需nginx -t && nginx -s reload生效。

Nginx 本身不支持直接用 access_log off 按 IP 动态关闭日志,但可以通过配置实现「对恶意 IP 段不记录访问日志」的效果——本质是让这些请求的日志写入空设备(如 /dev/null)或跳过主日志输出,既保持服务正常,又避免日志污染。
使用 map + access_log if 实现条件日志过滤
这是最推荐、最可控的方式。它不丢弃请求,只控制是否写入主日志文件。
在 http{} 块顶部(必须在所有 server 前)添加:
map $remote_addr $log_to_main {
default 1;
192.168.10.0/24 0;
10.200.0.0/16 0;
172.16.0.0/12 0;
203.0.113.45 0;
}然后在对应 server 或 location 中启用条件日志:
access_log /var/log/nginx/access.log main if=$log_to_main;
-
$log_to_main值为0时,该请求不会出现在access.log中 - 支持 CIDR 网段、单 IP、IPv6(格式如
[2001:db8::1]) - 修改后需
nginx -t && nginx -s reload生效
将恶意 IP 日志重定向到黑洞设备
适合彻底不想保留任何痕迹的场景(如扫描器、已确认的攻击源)。
同样先定义映射:
map $remote_addr $blackhole_log {
default /var/log/nginx/access.log;
185.143.224.0/22 /dev/null;
45.146.160.0/20 /dev/null;
194.187.77.0/24 /dev/null;
}再替换日志路径:
access_log $blackhole_log main;
- Linux 下用
/dev/null,Windows 下用null - 注意 Nginx 进程需有权限读取该设备(通常默认具备)
分离日志 + 后续审计(兼顾安全与排查)
若需保留恶意 IP 的访问行为用于分析,但又不想混入主日志,可单独记录:
map $remote_addr $malicious_log {
default off;
185.143.224.0/22 /var/log/nginx/malicious.log;
45.146.160.0/20 /var/log/nginx/malicious.log;
}
access_log $malicious_log main;
access_log /var/log/nginx/access.log main;- 匹配的 IP 会同时写入
malicious.log和主日志 - 若只想写专用日志,删掉第二行
access_log /var/log/nginx/access.log main;即可 - 配合 logrotate 或定时脚本清理
malicious.log,避免磁盘占满
不复杂但容易忽略


















