最有效方式是用curl模拟三类慢速行为验证超时:Slow Headers用--limit-rate 1 + --max-time;Slow Body发低速大body;Slow Read限速下载,再结合ss、error.log和定制日志观察连接释放与超时阶段。

直接用可控的慢速请求工具模拟攻击行为,观察 Nginx 是否按预期切断连接、返回对应状态码,并检查日志与连接数变化,是最有效的方式。
用 curl 模拟三类慢速行为验证超时响应
不需要额外安装工具,用标准 curl 即可分阶段验证:
-
Slow Headers(慢头):执行
curl -v --limit-rate 1 --max-time 120 "http://your-nginx-ip/",再手动中断并观察是否在client_header_timeout内返回408 Request Timeout;更精准可用nc手动逐行发 header,停顿超过设定值后确认连接被 RST -
Slow Body(慢体):对 POST 接口,用
curl -X POST --data-binary @/dev/zero -H "Content-Length: 10000000" --limit-rate 1 http://your-nginx-ip/api,看是否在client_body_timeout后断连(注意需保持proxy_request_buffering on) -
Slow Read(慢读):用
curl --limit-rate 10 --max-time 60 http://your-nginx-ip/large-file.txt,配合调高send_timeout到 30s 后再压测,确认超时后连接是否立即关闭而非挂起
监控关键指标确认机制生效
仅看返回码不够,要验证资源释放是否到位:
- 实时查活跃连接:
ss -tn state established '( dport = :80 or dport = :443 )' | wc -l,发起 50 个慢连接后,等待超时时间过去,连接数应明显回落(尤其开启reset_timedout_connection on后) - 检查 Nginx 状态页或
stub_status:关注Active connections峰值是否被压制,Reading状态连接不应长期堆积 - 翻 error.log:搜索
"client timed out"、"upstream timed out"、"408",确认日志中出现频次与模拟节奏一致,且无大量重复未释放连接记录
结合日志格式定位卡点阶段
在 http 块中临时添加精细日志,明确超时发生在哪一环:
- 定义日志格式:
log_format debug_time '$remote_addr - $request_time $upstream_connect_time $upstream_header_time $upstream_response_time $status'; - 对测试 location 启用该格式,发起慢请求后观察:
– 若$request_time接近client_header_timeout且后三项为空 → 卡在头部接收
– 若$upstream_connect_time长而$upstream_header_time为“-” → 卡在 upstream 建连(说明proxy_connect_timeout生效)
– 若$upstream_response_time超长但$status是 504 → 卡在后端响应读取(proxy_read_timeout触发)
用 ab 或 wrk 做轻量压力验证
避免单连接误判,用并发工具批量触发:
- 模拟 100 个慢头连接:
ab -n 100 -c 100 -H "User-Agent: slow-test" http://your-nginx-ip/,同时用watch 'ps aux | grep nginx | grep worker'看 worker 进程是否被阻塞 - 对比开启/关闭
reset_timedout_connection前后:ss -s | grep "TIME-WAIT"数值差异,开启后应显著减少 - 注意:ab 不支持慢速发送,仅用于验证连接数控制是否生效;真正慢速需靠 curl 或专用工具如
slowhttptest


















