nginx 默认不记录 deny 拒绝请求,需通过 error_log(warn 级别)、geo+if+log_format、map+access_log if 或 limit_req/conn 日志增强策略实现拦截日志记录。

Nginx 默认不会记录被 allow/deny 拒绝的请求(如返回 403 的请求),因为这些请求在访问日志写入前就被拦截了。要记录被拒绝的 IP 和上下文,需借助其他模块配合日志增强策略,不能只靠 access_log。
用 error_log 记录 deny 触发事件
当使用 deny 指令时,Nginx 实际是通过 ngx_http_access_module 在请求处理早期返回 403。这个动作默认不记日志,但可通过 log_not_found off 配合自定义 error 日志级别来捕获:
- 在
http或server块中添加:error_log /var/log/nginx/error.log warn;(提升级别到warn或notice) - 确保
deny所在位置上方没有if ($block_ip) { return 403; }类写法——这种写法不会触发 access_module 的标准拦截路径,也就不会被 error_log 自动捕获 - 真实生效的
deny拒绝会在 error.log 中留下类似记录:2026/10/02 07:15:22 [warn] 12345#12345: *12345 access forbidden by rule, client: 203.0.113.45, server: example.com, request: "GET /admin HTTP/1.1", host: "example.com"
用 geo + if + log_format 主动记录拒绝行为
更可控的方式是把“是否应被拒绝”提前映射为变量,再在 access_log 中显式输出该状态:
- 在
http{}顶部定义 geo 映射(支持网段):geo $should_block {<br> default 0;<br> 192.168.1.0/24 1;<br> 203.0.113.45 1;<br>} - 扩展日志格式,加入判断字段:
log_format blocked '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $should_block'; - 在对应 location 中启用:
access_log /var/log/nginx/blocked.log blocked;<br>if ($should_block) { return 403; } - 这样所有被拦截的请求仍会进入 access_log,且
$should_block值为 1,便于 grep 或 ELK 分析
用 map + access_log if 区分主日志与拦截日志
若想把拒绝请求单独归档、又不影响主日志结构,可用条件日志分流:
- 定义 map 变量:
map $remote_addr $is_blocked {<br> default 0;<br> 185.143.224.10 1;<br> 45.146.160.0/20 1;<br>} - 配置双日志:
access_log /var/log/nginx/access.log main if=$is_blocked;<br>access_log /var/log/nginx/denied.log denied if=$is_blocked;
其中denied是你自定义的含$is_blocked字段的日志格式 - 注意:该方案要求
if=$is_blocked为真时才写入,所以被拒 IP 会出现在denied.log,而不在access.log中
结合限流模块获取更细粒度拦截源
如果拒绝行为来自 limit_req 或 limit_conn,它们本身不走 deny 流程,但可精准记录:
- 必须启用:
limit_req_log_level warn;和limit_conn_log_level warn; - 在
log_format中加入$limit_req_status、$limit_conn_status,例如:log_format limited '$remote_addr $limit_req_status $limit_conn_status "$request" $status'; - 这类日志统一写入
error.log,内容含客户端 IP、触发 zone 名称、excess 数值等,比单纯 403 更具分析价值











