将 limit_conn_log_level 设为 error 可避免连接超限日志刷屏,仅保留真正需介入的错误;需配合 limit_req 缓冲流量并启用 stub_status、$limit 变量及 Prometheus 监控补位可观测性。

直接把 limit_conn_log_level 设为 error,就能让连接数超限事件完全不写入 error.log —— 这是最有效、最轻量的降噪方式。
为什么默认 warn 级别会拖垮磁盘
当突发流量或扫描攻击来袭,每秒可能有数百甚至上千个连接被 limit_conn 拒绝。默认 warn 级别会让每次拒绝都记一条日志,error.log 在几秒内就暴涨几十 MB。这不仅挤占磁盘 I/O,还掩盖真正的错误(比如 upstream timeout、SSL handshake fail),也增加日志轮转和归档压力。
log_level 选 error 是静默关键一步
limit_conn_log_level 不控制是否限流,只控制“被拒”这件事要不要记、以什么级别记。设成 error 后:
- 正常限流拒绝不再产生任何日志条目
- 只有极少数严重异常(如共享内存 zone 初始化失败)才会触发 error 级记录
- error.log 回归本职:专注记录真正需要人工介入的问题
必须搭配 limit\_req 缓冲真实流量
单靠 limit_conn_log_level error 只是“不说话”,不代表问题消失。要真正降低拒绝频次,得从行为上减少触发:
- 用
limit_req做请求级漏桶,在连接层之下再加一层缓冲 - 配置
burst=20 nodelay让短时突增请求排队,而非立刻拒绝 - 这样大部分流量被平滑处理,
limit_conn触发次数自然大幅下降
补充可观测性,避免“黑盒静默”
日志安静了,监控不能失位。推荐这几项补位措施:
- 启用
stub_status,实时看Accepted/Handled/Requests和Reading/Writing/Waiting状态 - 在 access log 中加入
$limit和$limit_key变量(需 OpenResty 或 patch 版本),标记哪些请求实际被限 - 用 Prometheus + nginxlog exporter 聚合统计每分钟被
limit_conn拒绝的连接数,设置阈值告警

















