最可靠方式是用压测工具分档模拟并发,验证limit_conn按预期限流、不误伤、不漏防;需配置共享内存区与location绑定,设429状态码,分50%/100%/150%/300%四档测试,并同步监控错误日志、访问日志及后端ESTAB连接数。

直接用压测工具模拟不同并发量,观察 Nginx 返回状态码、错误日志和后端负载变化,是最可靠的方式。关键不是只看“是否限流”,而是验证它在真实压力下是否按预期生效、不误伤、不漏防。
准备基础配置并确认生效位置
先确保 limit_conn 已正确定义和启用:
- 在 http 块中定义共享内存区,例如:
limit_conn_zone $binary_remote_addr zone=perip:10m; - 在 server 或 location 块中绑定限制,例如:
limit_conn perip 20;(表示单 IP 最多 20 个并发连接) - 加上
limit_conn_status 429;和limit_conn_log_level error;,便于识别和排查 - 重启 Nginx 并检查语法:
nginx -t,确认无报错
用 hey 或 ab 分层发起并发请求
避免一次性全量压测,应分档测试,比如从阈值的 50%、100%、150%、300% 四个档位逐步推进:
- 测试阈值内流量(如设限 20,用
-c 15):应全部 200 成功,无 429 - 测试临界点(
-c 20):多数成功,极少数可能因竞争出现 429(属正常) - 测试超限(
-c 25或-c 50):稳定出现约(并发数 − 阈值)比例的 429 响应 - 命令示例:
hey -n 100 -c 30 http://your-site.com/api/health
同步监控三类关键反馈
单靠返回码不够,要交叉验证系统行为是否符合设计意图:
-
错误日志:执行
tail -f /var/log/nginx/error.log,看到limiting connections by zone "perip"表示模块已介入 -
访问日志:若 log_format 包含
$limit和$limit_key,可统计哪些 IP 被限、触发频次 -
后端负载:用
htop或ss -s观察 ESTAB 连接数是否被压在阈值附近,确认未突破设定上限
注意 SPA 和 HTTP/2 的特殊影响
前端是 Vue/React 单页应用或启用 HTTP/2 时,容易低估实际连接消耗:
- SPA 刷新页面或开多个标签页,会复用域名下的 keepalive 连接,但每个仍计入 limit_conn 总数
- HTTP/2 下一个 TCP 连接承载多个 stream,但 limit_conn 只计为 1 个连接——这反而是优势,需结合
keepalive_timeout 15;主动回收空闲连接 - 若发现正常用户频繁 429,检查是否 location 匹配过宽(如写在
location /下导致静态资源也受限)


















