ab或wrk短时高并发测试可验证Nginx限流准确性;配置rate=2r/s、burst=5时,ab -n 20 -c 10应得7~9个成功请求,超限请求返回503或明显延迟;nodelay决定是否排队——启用则超限即返503,否则排队等待。

直接用 ab(Apache Bench)或 wrk 工具发起短时高并发请求,是最简单有效的测试方式。关键不是压出吞吐量,而是验证 Nginx 是否按配置准确拦截、排队或拒绝超出限制的请求。
用 ab 命令快速验证限流行为
假设你已配置了每秒最多 2 个请求(rate=2r/s),并允许突发 5 个(burst=5):
- 执行:
ab -n 20 -c 10 http://your-domain.com/api/login/ - 含义:共发 20 个请求,模拟 10 个并发连接(即瞬间打满)
- 预期结果:
- 成功请求数 ≈ 7~9 个(前 2 个立即处理 + 后续 5 个进 burst 队列)
- 其余请求返回 503 Service Temporarily Unavailable(若带
nodelay)或明显延迟(若不带) - 查看响应时间分布:大部分在毫秒级,但部分请求耗时突增(排队等待)
区分 nodelay 和无 nodelay 的实际表现
同一限流配置下,nodelay 是决定“是否排队”的开关:
-
带 nodelay:超出
burst的请求立刻返回 503,响应时间极短( - 不带 nodelay:超限请求会排队等待令牌,响应时间拉长(可能达数秒),容易引发客户端超时
- 测试时可对比两次 ab 输出中的
Time per request (mean)和Failed requests数值变化
观察 Nginx 日志确认拦截细节
在 http 或 server 块中添加日志标记,让限流动作可追溯:
- 配置示例:
limit_req zone=mylimit burst=5 nodelay; log_format limitlog '$remote_addr - $status [$time_local] "$request" $request_time $upstream_response_time'; access_log /var/log/nginx/limit_access.log limitlog; - 测试后查日志:
grep " 503 " /var/log/nginx/limit_access.log - 能清晰看到哪些 IP 被拒、何时被拒、请求耗时多长,排除误配或缓存干扰
组合 limit_req + limit_conn 更贴近真实攻击场景
单纯限速不够,CC 攻击常伴随大量短连接。建议叠加并发连接限制:
- 配置:
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;+limit_conn conn_limit 3; - 再用
ab -n 30 -c 20测试:即使速率未超,也会因连接数超限触发 503 - 此时日志中会出现
503且$upstream_response_time为 “-”,说明请求根本没发往后端











