client_header_timeout是防范Slowloris类慢速头部攻击最直接有效的配置,从首字节起计时至rnrn结束,超时返回408并秒级断连;公网设7秒、网关10–15秒、内网3–5秒,须配套reset_timedout_connection on、limit_conn和缓冲区调优。
client_header_timeout 是 Nginx 防范 Slowloris 类慢速头部攻击最直接有效的配置项,它从客户端发来第一个 HTTP 字节起计时,到完整收到 rnrn(空行)为止;超时即返回 408 并立即断连,不进 upstream、不占后端资源、不触发业务逻辑。
该参数支持在 http、server 或 location 块中配置。推荐优先放在 server 块内,实现按服务粒度差异化防护:
7s
10–15s,但需先观察真实流量的 P99 头部接收耗时再加缓冲3–5s,链路稳定且无中间设备干扰单设 client_header_timeout 效果有限,需与以下配置协同生效,形成事件循环级闭环防护:
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),避免因缓冲不足触发重试或异常等待,反而延长连接占用时间不能仅靠 nginx -s reload 成功就认为配置起效,需实测模拟慢速行为:
curl -X GET http://your-domain.com/ --limit-rate 10 -m 30(限速 10 字节/秒,总超时 30 秒)408 Request Timeout,并检查 error log 是否出现 client timed out 日志$request_time 和 $status,筛选出 status=408 且 request_time 接近 timeout 值的请求,确认是头部阶段被拦截这个参数只控制请求头接收阶段,有明确边界:
client_body_timeout 控制send_timeout 范畴ssl_handshake_timeout