location块防范慢速攻击需收紧连接生命周期与资源阈值:client_header_timeout卡死空连、limit_conn限制单IP并发、client_body_timeout/send_timeout封堵慢传体与慢读响应、reset_timedout_connection+keepalive_timeout快速释放僵尸连接。

在 location 块中防范慢速死连接攻击,核心不是靠 location 本身“拦截”,而是通过精准收紧该路径下的连接生命周期与资源占用阈值。Nginx 的慢速攻击防护主战场在连接建立后、请求处理前的“空转”阶段,location 是最合适的粒度——既能按业务路径差异化设防(如登录页更严、静态资源更松),又避免全局一刀切影响正常服务。
client_header_timeout:卡死“只连不发头”的入口
这是 location 级最有效的第一道闸。Slowloris 攻击者建连后迟迟不发完 \r\n\r\n,Nginx 就一直等。设太长(默认 60s)等于给攻击者留足空间;设太短又误伤弱网用户。
- 普通 API 或页面接口:直接写
client_header_timeout 8s;—— 覆盖绝大多数合法客户端(含跨境 CDN 抖动),又能拦住每 10–15 秒补一个字段的扫描器 - 鉴权类路径(如
/login、/api/v1/token):若携带长 JWT 或多段 Cookie,先开启日志记录$request_time,观察 P99 头部接收耗时,再加 2–3 秒缓冲,上限不超过 12 秒 - 纯静态资源(如
/static/):可放宽至 15s,但必须配合limit_conn防批量试探
limit_conn:按路径限制单 IP 并发连接数
超时参数治标,限流治本。攻击者常绕过 timeout,用多个 IP 或高频建新连接。在 location 中叠加限流,能直接堵住资源耗尽路径。
- 先在
http块定义共享内存区:limit_conn_zone $binary_remote_addr zone=perip:10m; - 在敏感 location 中启用硬限制:
limit_conn perip 5;—— 表示每个 IP 在该路径下最多维持 5 个并发连接 - 对登录、支付等高危路径,建议设为
3;对公开 API 可设为10–20;静态资源可设为50以兼顾 CDN 回源
client_body_timeout + send_timeout:封堵慢传体与慢读响应
这两项必须成对出现在 location 中,否则攻击者可在不同阶段切换策略。
-
client_body_timeout 10s;:适用于 POST/PUT 接口。它不看总上传时间,只盯“两次数据到达间隔”。攻击者声明Content-Length: 10MB却每分钟发 1 字节,10 秒无新数据就断连 -
send_timeout 8s;:控制响应发送节奏。对普通 JSON 接口足够;若该 location 返回大文件或 SSE 流,需单独设为60s并关闭proxy_buffering - 注意:
send_timeout对已缓冲完成的响应无效,只管“正在写但卡住”的情况
reset_timedout_connection + keepalive_timeout:快速释放僵尸连接
仅设超时不够,必须让内核立刻回收 socket。尤其在 location 中处理高敏感操作时,拖延释放会加剧连接表压力。
-
reset_timedout_connection on;:超时后发 RST 包而非 FIN,跳过四次挥手,立即释放文件句柄和端口 -
keepalive_timeout 5s;:该 location 下长连接空闲 5 秒即断。比默认 75 秒激进得多,专防 Slow Read 复用连接扫描 - 这两项虽可在 http 块全局设,但在 location 中重写能实现“关键路径更狠、非关键路径更稳”


















