应设为10–15秒,用于防控慢速post攻击,即两次发包间空闲超时即断连;需协同proxy_request_buffering on、client_max_body_size、reset_timedout_connection on等配置共同生效。

直接设为 10–15 秒,并确保它和 proxy_request_buffering on、client_max_body_size、reset_timedout_connection on 协同生效。它不控制总上传时间,只管“两次发包之间空闲多久就砍掉”——这才是防慢速 POST 的关键逻辑。
为什么 10–15 秒是主流推荐值
这个区间能覆盖绝大多数真实场景,又足够快地暴露异常行为:
- 浏览器或标准 App 发起 POST 后,通常在 1–3 秒内就开始发送 body 数据(含 TLS 握手、DNS、应用层准备)
- 弱网移动设备偶有延迟,但极少连续空闲超 10 秒;设到 15 秒已留出合理余量
- 攻击者若每 10 秒才发 1 字节,10 秒 timeout 就能立即断连,不给 worker 进程持续占位的机会
- 设成 1–2 秒会误杀合法请求;设成 60 秒(默认值)等于敞开大门让 Slow Body 攻击排队进场
必须同步开启的配套配置
单靠 client_body_timeout 无法闭环防御,以下几项缺一不可:
-
proxy_request_buffering on:强制 Nginx 先收全 body 再转发,否则慢速体可能直接穿透到后端 -
client_max_body_size 20M:硬限制上传上限,防止攻击者声明Content-Length: 1GB却只慢速发几个字节 -
reset_timedout_connection on:超时后发 RST 包立即释放 socket,避免堆积 TIME_WAIT 和句柄 -
client_body_buffer_size 128k:控制内存缓冲大小,过大易被慢连接长期持占,过小则频繁落盘增加 I/O 压力
反向代理场景下的特别注意点
当 Nginx 作为前置代理时,后端处理节奏会影响整体防御效果:
- 务必同步调优
proxy_read_timeout,建议设为后端 P95 响应时长 + 20% 余量,避免 Nginx 在等后端时又被拖住 - 禁用
proxy_buffering off或proxy_request_buffering off会绕过所有 body 超时机制,使慢速攻击直达后端 - 如果后端支持分片上传或断点续传,Nginx 层仍应保持
client_body_timeout ≤ 60s,由业务层通过心跳保活控制节奏
验证是否真正生效的方法
用 curl 模拟攻击行为,观察是否在预期时间内断连:
curl -X POST http://your-domain.com/api --data-binary @/dev/zero --limit-rate 50 -m 60- 其中
--limit-rate 50表示每秒只发 50 字节,-m 60是客户端总超时 - 若 Nginx 配置了
client_body_timeout 10s,连接应在约 10 秒后主动关闭并返回 408 - 配合 access log 中的
$request_time和$status字段,可确认超时是否发生在 body 阶段










