测试 limit_conn 在弱网下的重连保护,需用 hey -disable-keepalive 模拟短连接高频重连,配合 tc 注入延迟丢包,验证 Nginx 能否准确识别同一 IP 并发连接、稳定限流,避免因连接异常导致计数失效或误判。

测试 limit_conn 在弱网环境下的重连保护,核心是模拟连接不稳定、频繁断连重连的客户端行为,验证 Nginx 是否仍能准确识别同一 IP 的并发连接数并稳定执行限流,而不是因 TCP 连接反复建立/关闭而误判或失效。
用 hey 或 wrk 模拟弱网重连行为
HTTP 工具默认复用连接(keepalive),无法体现弱网下“短连接+高频重连”的特征。需强制禁用 keepalive,并控制请求间隔与超时,贴近真实弱网表现:
- 使用 hey -disable-keepalive -c 20 -n 200 -timeout 3s http://your-domain.com/:每请求新建 TCP 连接,20 并发持续发起共 200 次请求,3 秒超时——模拟丢包、延迟导致的快速重试
- 更贴近弱网可加网络限制:在 Linux 上用 tc 命令注入延迟和丢包,例如:
tc qdisc add dev eth0 root netem delay 300ms 50ms loss 5%,再运行压测工具 - 避免 ab:ab 不支持 -disable-keepalive,且对连接异常响应处理较粗糙,容易掩盖重连逻辑问题
重点观察连接状态是否被正确累积与释放
弱网下关键风险是:连接未正常关闭(如 FIN 未到达)、TIME_WAIT 大量堆积、或 Nginx 未能及时回收连接计数,导致限流失准。需交叉验证:
- 实时查 Nginx 当前连接数:ss -tn src :80 | grep ESTAB | wc -l,对比 limit_conn 阈值 × 并发客户端数,确认未突破理论上限
- 检查错误日志是否持续出现 “limiting connections by zone”,且 client IP 字段稳定(非跳变),说明 $binary_remote_addr 识别一致
- 抓包验证(可选):tcpdump -i lo port 80 -w weaknet.pcap,过滤同一客户端 IP 的 SYN 包数量,确认其是否被 Nginx 在 accept 前拦截(无对应 ESTABLISHED 状态)
排除真实 IP 与连接复用干扰
弱网常伴随代理、移动网关或 NAT,易造成 IP 识别偏差或连接复用异常:
- 若前端有 CDN 或 LB,必须配置 set_real_ip_from + real_ip_header X-Forwarded-For,并改用 $realip_remote_addr 定义 zone,否则所有重连都算作“同一个代理 IP”,失去单 IP 限流意义
- 检查 keepalive_timeout 设置(建议 15–30s):过短会导致健康客户端也被频繁断开,增加无效重连;过长则 TIME_WAIT 堆积,占用连接槽位
- 确认未开启 limit_conn_dry_run on:该模式只记日志不拦截,弱网测试中会完全失效
结合后端负载与响应码验证实际效果
仅看 Nginx 日志不够,要确认限流是否真正缓解了后端压力:
- 用 curl -I http://your-domain.com/ 手动触发单次请求,观察返回 limit_conn_status(如 503)是否稳定出现,且响应头中无 Set-Cookie 或后端服务标识
- 监控后端应用连接池活跃数(如 MySQL 的 Threads_connected、Java 应用的 active connections),在压测期间应明显低于无限流时的峰值
- 对比两次压测:一次正常网络(-c 20),一次弱网(-c 20 + tc 限速),若后者 503 比例显著升高且后端负载更平稳,说明重连保护有效


















