需配置 limit_conn_log_level error、limit_conn_status 503(或429)、log_format 包含 $limit 和 $limit_key 变量,并单独设置 error_log 路径与级别为 error,以实现限流事件的清晰记录与精准追溯。

默认情况下,Nginx 在触发 limit_conn 限制时会记录一条 warn 级别的日志到 error.log,但内容较简略(如 limiting connections by zone "perip"),且容易被高频限流日志淹没。要清晰、可追溯地记录被拒绝的连接,需主动配置以下几项:
调整日志级别和状态码
让限流事件更醒目、更易过滤:
-
limit_conn_log_level error;—— 将日志级别从默认warn提升为error,避免混入常规警告中 -
limit_conn_status 503;(或设为429)—— 明确返回状态码,便于在access.log中直接识别限流响应
扩展 access.log 记录关键上下文
在 log_format 中加入两个内置变量,能精准定位谁、因何被限:
-
$limit:显示匹配的限流 zone 名称(如perip或conn_total) -
$limit_key:显示触发限制的实际 key 值(如客户端二进制 IP:\x0A\x00\x00\x01;若用$server_name则显示域名)
示例日志格式定义(放在 http 块):
'$status $body_bytes_sent "$http_referer" "$http_user_agent" '
'"$limit" "$limit_key";'
这样每条被限流的 503 请求,在 access.log 中就会带 zone 名和具体 key,支持按 IP 或 zone 快速统计。
确保 error.log 足够详细且独立存放
error.log 是唯一记录连接拒绝原因的地方,建议:
- 显式指定路径与级别:
error_log /var/log/nginx/limit_reject.log error;(单独文件 +error级别) - 避免使用
debug级别(开销大),error已足够捕获所有limit_conn拒绝事件 - 注意:该日志只记录“拒绝建立新连接”的瞬间,不记录 keepalive 空闲连接超时等行为
验证是否生效的小技巧
用 ab 或 wrk 模拟并发连接即可快速验证:
- 配置
limit_conn perip 2;后,并发发起 5 个长连接(如curl -o /dev/null http://host/ --max-time 30并行执行) - 检查
access.log中是否有大量503行,且含"perip" "xxx" - 检查
limit_reject.log是否出现limiting connections by zone "perip"的error条目











