慢速网络下应分层配置client_body_timeout并配套防护:小文件上传设60–90秒,大文件上传设300秒且配client_max_body_size,流式上传设60秒并要求心跳;同步启用client_header_timeout、reset_timedout_connection、合理limit_conn及client_max_body_size,实测弱网成功率与超时行为。

在慢速网络环境下配置 client_body_timeout,核心不是一味延长超时时间,而是区分“真实弱网延迟”和“恶意慢速攻击”,通过分层设值+配套防护,让合法上传不中断、恶意连接被快速清理。
按上传类型差异化设值,避免一刀切
统一设成 60 秒或 120 秒会放大攻击面,应结合实际数据节奏调整:
- 移动端小文件上传(如头像、语音片段、日志上报):设为 60–90 秒。弱网下 DNS 切换、蜂窝/Wi-Fi 切换、后台 App 唤醒都可能导致 5–15 秒静默,留出余量可大幅降低 408 率
-
管理后台大文件上传(如 CMS 上传 PDF、Excel):设为 300 秒(5 分钟),但必须同步设置
client_max_body_size 100M,防止攻击者声明 2GB 却只每分钟发 1 字节 - 流式或分片上传接口(如视频分块、断点续传):仍建议设为 60 秒,但要求客户端每 30 秒至少发送一个分片头或心跳包;否则视为异常连接直接断开
必须同步启用的关键配套参数
单独调高 client_body_timeout 不仅无效,反而助长攻击。以下四项需同时生效:
-
client_header_timeout 10s:防攻击者只发POST /api就卡住,确保 header 阶段不被拖长 -
reset_timedout_connection on:超时后发 RST 包立即释放 socket 句柄,避免 TIME_WAIT 堆积——这对 Windows 或高并发场景尤为关键 -
client_max_body_size合理上限:API 接口设 10–20M,后台上传设 100–200M;超出直接返回 413,不进 timeout 流程 -
limit_conn perip 10:限制单 IP 最多 10 个并发连接,防止攻击者用几十个慢连接耗尽 worker_connections
验证是否真正适配弱网,而非放任攻击
不能只看配置是否写入,要实测两种行为:
- 用
curl --limit-rate 200模拟 200B/s 的极慢上传,观察是否在设定值(如 90s)内返回 408,并检查 error log 中出现 "client timed out while reading client request body" - 用真实弱网环境(如 iOS 网络条件模拟器设为 “Very Poor Network”)上传 5MB 图片,确认成功率 >95%,且无批量 408 报错
- 抓包观察连接关闭方式:合法超时应看到 Nginx 主动发出 RST 包,而非等待 FIN/ACK 完成










