需配置 limit_conn_log_level error、limit_conn_status 503,并在 log_format 中加入 $limit 和 $limit_key 变量,同时将 error_log 单独设为 limit_reject.log;验证时并发请求应同时在 access.log(含503及zone/key)和 limit_reject.log 中留下对应记录。

要让 Nginx 在日志中清晰记录被 limit_conn 拦截的客户端信息,不能只靠默认行为——它默认只在 error.log 里写一条简略的 warn 级日志(如 limiting connections by zone "perip"),既难过滤又缺上下文。真正实用的记录方式需要三方面配合:提升日志级别、扩展访问日志字段、分离错误日志路径。
把限流事件升级为 error 级别
默认 warn 级容易被其他警告淹没,且无法和普通业务错误区分。必须显式配置:
-
limit_conn_log_level error;—— 让每次连接拒绝都记为 error,方便用grep ERROR limit_reject.log快速定位 -
limit_conn_status 503;或429;—— 返回明确状态码,这样access.log中对应请求行就会带503,一眼可识别是限流而非后端故障
在 access.log 中补全关键标识
仅靠状态码还不够,你得知道“谁、因哪个规则”被拦。Nginx 提供两个专用变量:
-
$limit:显示触发限制的 zone 名(如perip、conn_total) -
$limit_key:显示实际匹配的 key 值(如客户端 IP 的二进制形式\x0A\x00\x00\x01,或域名example.com)
把这些加进 log_format,例如:
这样每条被限的 503 请求,在 access.log 里就同时有 zone 名和具体 key,支持按 IP 段或 zone 分组统计拦截量。
单独存放限流拒绝日志
error.log 是唯一记录“为何拒绝”的地方(比如内存 zone 耗尽、key 冲突等)。建议独立配置:
-
error_log /var/log/nginx/limit_reject.log error;—— 单独文件 + error 级别,避免混入其他错误 - 不启用
debug级别:开销大,且error已覆盖所有连接拒绝事件
注意:该日志只记录“新连接被拒”的瞬间,keepalive 连接空闲超时、SSL 握手失败等不在此列。
验证是否生效的小方法
配好后用并发工具快速验证:
- 设
limit_conn perip 1;,然后并行发起 3 个长连接(如curl -o /dev/null http://host/ --max-time 30) - 检查
access.log:应出现多条含503、"perip"和 IP 二进制值的日志 - 检查
limit_reject.log:应有类似limiting connections by zone "perip"的 error 条目











