最有效测试方式是用可控慢速客户端工具实测:curl --limit-rate 1模拟慢头,7秒内应返回408;slowhttptest验证limit_conn限流,超限连接须返回503;配合ss -s和error.log中“client timed out”“limiting connections”日志确认防御闭环。

直接用可控的慢速客户端工具发起连接,观察 Nginx 是否按预期切断、拒绝或限流,是最有效、最贴近真实攻击场景的测试方式。不需要等攻击发生,也不依赖日志事后分析——测试本身就能验证配置是否真正生效。
用 curl 模拟 Slowloris 类慢头攻击
这是验证 client_header_timeout 和 reset_timedout_connection on 是否起作用的最快方法:
- 执行命令:
curl -v --limit-rate 1 --max-time 30 "http://your-domain.com/" -
--limit-rate 1强制每秒只发 1 字节,让请求头发送极度缓慢 -
--max-time 30是 curl 自身超时,确保它不会提前退出 - 如果 Nginx 配置了
client_header_timeout 7s,通常在第 7–8 秒会返回408 Request Timeout,且连接立即断开(可通过netstat -ant | grep :80确认无残留 ESTABLISHED 或 CLOSE_WAIT)
用专门工具批量压测并发连接数限制
验证 limit_conn_zone + limit_conn 在慢连接下的硬性拦截效果:
- 使用
slowhttptest(推荐):slowhttptest -c 100 -H -g -o slowtest -i 10 -r 200 -t GET -u http://your-domain.com/ -x 24 -p 3 -
-c 100表示模拟 100 个并发连接;-i 10表示每 10 秒发一个 header 字段,典型 Slowloris 手法 - 若已配置
limit_conn perip 10,则第 11 个及以上连接会被直接拒绝(返回503 Service Temporarily Unavailable或连接被 RST) - 观察
nginx -t后 reload,再运行测试,对比 error.log 中是否出现limiting connections by zone日志
监控关键指标确认防御闭环
光看返回码不够,要确认资源是否真正释放、不被拖住:
- 实时查看活跃连接状态:
ss -s或netstat -ant | awk '{print $6}' | sort | uniq -c,重点看ESTABLISHED数是否被压制在worker_connections × worker_processes的合理范围内 - 检查 Nginx 状态页(需启用
ngx_http_stub_status_module):Active connections值应稳定,Reading状态不应持续攀升(Slowloris 主要卡在这里) - 观察 error.log:
client timed out表示超时生效;limiting connections by zone表示限流触发;两者都出现,说明防御链路完整
避免误判:区分真实弱网与攻击行为
测试时注意排除干扰,防止把正常延迟当成防御失败:
- 不要在高丢包、高抖动的公网环境做基准测试,优先在内网或容器网络中复现
- 用同一台机器发起多个慢连接时,
$binary_remote_addr相同,能准确触发 per-IP 限流;如用不同 IP(如代理池),需改用$server_addr或自定义变量 - 若测试中大量出现
400 Bad Request,可能是client_header_buffer_size过小导致合法大 header 被截断,不是超时问题,需同步调优缓冲区


















