验证连接数限制是否生效,关键在于模拟攻击特征并交叉比对错误日志、响应状态码(如503)、共享内存拒绝计数三项信号,同时通过边界测试确保正常用户不受影响,并分阶段灰度上线。

直接在生产环境验证连接数限制是否生效,关键不是“测出崩溃”,而是观察它是否按预期拦截、拒绝、分流异常连接,同时不影响正常用户。验证的核心逻辑是:模拟攻击特征 → 观察 Nginx 行为 → 对照日志与指标确认策略执行。
用真实流量特征做靶向压测
避免用简单工具(如 ab 或 curl 循环)只打单个 URL,这类请求缺乏攻击典型性。应复现慢速攻击(Slowloris)、连接耗尽型扫描或高频短连接爬虫的行为:
- 用 slowhttptest 模拟 Slowloris:保持大量半开 TCP 连接,不发完整请求头,专测
limit_conn是否及时断连 - 用 k6 脚本发起高并发短连接(vus=2000+,duration 短,keepalive 关闭),验证
limit_conn_zone是否触发 503 并记录到 error log - 对限流路径(如
/api/login)发起 IP 聚焦请求(同一源 IP 发起 50+ 并发),检查是否被稳定拦截而非随机失败
盯紧三类输出信号
验证不是看“有没有报错”,而是交叉比对以下三项是否一致:
-
错误日志:在
error_log中搜索"limiting connections"或"limiting requests",确认命中限流时有明确记录;若无日志,说明配置未加载或 zone 未生效 -
响应状态码:被
limit_conn拦截默认返回 503;被limit_req拒绝默认返回 503(可配limit_req_status 429)。用curl -I或监控采集 HTTP status 分布,确认超限请求是否稳定返回预期码 -
共享内存状态:通过
nginx -T | grep limit_conn_zone确认 zone 名称,再用nginx -s reload后访问/status(需启用ngx_http_stub_status_module)或 Prometheus 的nginx_connections_active和nginx_limit_conn_rejected_total指标,看拒绝计数是否随压测上升
区分真实防护与误伤
验证必须包含“边界测试”:在触发限流阈值前后各做一次小流量回归,确认正常用户行为不受影响:
- 用不同 IP 同时发起 10 QPS 请求,检查是否全部成功(证明未全局锁死)
- 用被限流的 IP 在 burst 容量内(如
burst=20)发 15 个请求,确认前 15 个能通过,第 16 个开始被拒 - 检查 access log 中被拒请求的
$status和$connection_requests字段,确认它们确实来自同一 IP 且连接数已达上限
线上灰度验证更安全
不建议全站一次性开启严苛限流。推荐分阶段上线:
- 先在非核心路径(如
/healthz或测试接口)配置宽松规则(如limit_conn conn_perip 5),用少量测试 IP 验证日志和指标链路通顺 - 再切 5% 流量到新配置的 ingress rule 或 server 块,接入 Grafana 看板实时观察
5xx rate和conn_rejected曲线是否同步抬升 - 最后全量前,保留 1 小时观察窗口:对比开启前后同一时段的平均连接数、TIME_WAIT 数量、worker process CPU 使用率,确认无资源反升现象











