client_header_timeout是防御slowloris攻击的第一道硬闸,从首字节起计时至完整请求头接收完毕即断连返408;需配合client_body_timeout、send_timeout、keepalive_timeout收紧超时,并启用reset_timedout_connection与限流实现综合防护。

直接收紧四类超时参数,配合连接复位与限流,是防范 Slowloris 最有效、最轻量的方式。它不依赖额外模块或防火墙规则,而是让 Nginx 主动识别并切断“只连不发、发得极慢、发不完”的异常连接。
client_header_timeout:卡死慢发请求头
这是第一道硬闸。Slowloris 最常用手法就是建好 TCP 连接后,每隔十几秒才发一个 User-Agent: 或 X- 头字段,永远不发结尾的 \r\n\r\n。Nginx 默认等 60 秒,攻击者只需几十个连接就能拖满一个 worker 的 1024 个槽位。
- 普通 Web 页面或 REST API:设为 5–10 秒,覆盖真实弱网但远低于攻击容忍窗口
- 内网服务或可信网关后:可压至 3 秒
- 含大量 Cookie 或 SSO 头的登录页:先用
log_format记录$request_time,观察 P99 头部接收耗时,再加 2–3 秒缓冲,上限不超过 15 秒
client_body_timeout 和 send_timeout:堵住慢传体与慢读响应
前者防攻击者声明 Content-Length: 10MB 却每分钟只送 1 字节;后者防客户端不读响应、只挂连接(Slow Read)。
-
client_body_timeout:控制两次数据到达的最大间隔,不是总上传时间。常规接口设 5–10 秒;文件上传可放宽至 300 秒,但必须配client_max_body_size限制大小 -
send_timeout:Nginx 往客户端写响应时的空闲等待上限。普通接口建议 8–12 秒;SSE 或流式接口需调高至 60–300 秒,并关闭proxy_buffering
keepalive_timeout + reset_timedout_connection:快速清理僵尸连接
默认 75 秒的长连接空闲时间,在攻击下会堆积大量 TIME_WAIT 状态,挤占可用 socket。单设 timeout 不够,必须强制复位。
- 对外服务建议 keepalive_timeout 5–10 秒
- 必须开启
reset_timedout_connection on,超时后直接发 RST 包中断,而非等待 FIN 握手,释放更干净 - 若启用了 HTTPS,建议略宽一点(如 5–8 秒),以包容 TLS 握手延迟
配套加固:缓冲区、限流与验证
超时是核心,但需组合生效:
- 缩小头缓冲区:
client_header_buffer_size 1k,large_client_header_buffers 2 2k,避免攻击者靠“小步慢走”绕过超时检测 - 限制单 IP 初始连接数:
limit_conn_zone $binary_remote_addr zone=addr:10m;+limit_conn addr 10;,防多 IP 扫荡 - 实测验证:
curl -v --limit-rate 10 http://your-site/,看是否在设定秒数内返回 408 或断连 - 检查日志中是否有 "client timed out (read header)" 等记录,确认配置已实际触发











