设 warn 才能审计非法 ip,因为默认 error 级别不记录连接拒绝事件,而 warn 会为每次限流生成含客户端 ip、时间戳等关键信息的日志,是追溯扫描、爬虫等行为的第一手依据。

把 limit_conn_log_level 设为 warn 或更低(如 notice、info),就能让每次连接被拒绝都记一条日志,从而留下非法 IP 的行为痕迹;但要注意,高频触发时会迅速刷爆日志,真正想做审计,得配合日志聚合与告警机制,不能只靠它“记全”。
为什么设 warn 才能审计非法 IP
默认 limit_conn_log_level error 只记录初始化失败等底层异常,连接被拒完全不写日志——等于“静默拦截”,无法回溯谁被拦、拦了多少次。
设成 warn 后,每个被限流的连接都会在 error.log 中生成一条带时间戳、客户端 IP、zone 名称和 server name 的日志行,例如:
- 2026/05/12 02:28:14 [warn] 12345#0: *67890 limiting connections by zone "perip", client: 192.168.3.11, server: api.example.com, request: "GET /data HTTP/1.1", host: "api.example.com"
这类日志是定位扫描 IP、爬虫源、暴力探测行为的第一手依据。
设成 warn 后必须做的三件事
- 限制日志写入频率:单靠 limit_conn_log_level 无法限频,需搭配 iptables LOG 或 nginx 自身的 limit_req 做前置缓冲。例如先用 limit_req 控制请求速率,再让真正突破连接上限的少数 IP 触发 warn 日志,避免每秒几百条日志压垮磁盘。
- 用 log_format 提取关键字段:在 http 块中定义含 $binary_remote_addr、$limit_conn_status、$time_local 的自定义格式,方便后续用 grep、awk 或 ELK 快速筛选异常 IP。
- 配置外部聚合告警:Nginx 不支持“每分钟最多记 5 条”,必须用 Prometheus + nginxlog exporter 统计单位时间内某 IP 触发 warn 日志次数,超阈值(如 30 次/分钟)自动触发告警或调用 fail2ban 封禁。
更实用的审计组合策略
- 对高风险路径(如 /admin、/login)启用 limit_conn perip 3 + limit_conn_log_level warn,专注捕获可疑行为;
- 对普通接口保持 limit_conn_log_level error,避免日志污染;
- 同时开启 limit_conn_status 429,让客户端收到标准状态码,前端或 WAF 可据此标记并上报异常会话;
- 定期用脚本分析 error.log 中 warn 行,统计 top 10 高频触发 IP,加入 ipset 黑名单并同步到 iptables。
单纯调高日志级别不是审计,只是留痕起点。真正有效的 IP 行为审计,靠的是“限流留痕 + 格式化采集 + 速率聚合 + 自动响应”这一整套闭环。










