client_header_timeout是nginx在请求头阶段阻断慢速攻击的最直接防线,从首字节起计时至\r\n\r\n结束,超时即返408并秒级释放资源;公网设7秒、网关10–15秒、内网3–5秒,须配套reset_timedout_connection、连接限速及缓冲区配置。

client_header_timeout 是 Nginx 在请求头阶段阻断慢速攻击的最直接防线。它不等业务逻辑、不进 upstream,只专注一件事:从客户端发来第一个字节起计时,到完整收到 \r\n\r\n 结束的 HTTP 请求头为止;超时即返回 408 并立即断连——此时后端完全无感知,worker 进程、socket 句柄和内存缓冲区秒级释放。合理配置的关键,是让这个“秒级裁决”既精准拦截恶意拖延,又不误伤真实弱网用户。
按业务链路设定 timeout 值
公网 Web 页面或标准 REST API:设为 7 秒
浏览器、curl、主流 SDK 通常在 1–2 秒内发完全部 header;7 秒可覆盖跨境延迟、CDN 中转抖动,同时能卡住每 10 秒补一个字段的 Slowloris 扫描器含 JWT Token、多段 Cookie 或 SSO 鉴权头的网关服务:设为 10–15 秒
必须同步检查client_header_buffer_size和large_client_header_buffers是否足够,否则缓冲区溢出会触发重试或异常等待,反而延长连接占用时间内网反代、Kubernetes Ingress 后置服务:可压至 3–5 秒
链路稳定、无 NAT、无中间检测设备,防御强度更高;但低于 3 秒易误杀老旧 IoT 设备或高丢包移动终端
必须配套的三项基础加固
reset_timedout_connection on;
超时后主动发送 RST 包中断连接,跳过四次挥手,立即释放 socket 句柄和内核连接槽位,避免 TIME_WAIT 滞留limit_conn_zone $binary_remote_addr zone=perip:10m;limit_conn perip 10;
限制单 IP 初始并发连接数,防攻击者用多个地址绕过 timeout 机制client_header_buffer_size 4k;large_client_header_buffers 4 16k;
确保能容纳常见大 header(如长 Token、多 Cookie),避免因缓冲不足导致读取异常、重试或提前报错,干扰 timeout 正常触发
验证是否真正生效,而非仅 reload 成功
用 curl 模拟慢速头部:
curl -X GET http://your-domain.com/ --limit-rate 10 -m 30(限速 10 字节/秒,总超时 30 秒)查 error.log 是否出现:
client timed out while reading client request headers查 access.log 中状态码是否为
408,且$request_time接近你设置的 timeout 值(如6.98s),说明配置已起效运行
netstat -ant | grep :80 | grep SYN_RECV,确认慢速攻击连接未堆积在SYN_RECV或ESTABLISHED状态中
不复杂但容易忽略











