应将 client_header_buffer_size 设为2k–8k并配套设置large_client_header_buffers(如4 8k),同时启用client_header_timeout、underscores_in_headers等防护措施。

直接在 http 或 server 块里配两个指令就行:一个是初始缓冲大小,一个是备用缓冲池。重点不是堆内存,而是让合法请求能过、恶意请求被拦住。
client_header_buffer_size 设多少合适
这是每个请求最先用的那块内存,默认只有 1KB,多数现代应用撑不住:
- 含 JWT Token(常 1.2–2.5KB)、多域 Cookie 或前端埋点头的 Web 应用,建议设为 2k 或 4k
- 微服务网关或需透传大量自定义 Header 的场景,可设为 8k,但必须同步收紧超时
- 纯静态站或简单 API,保持默认 1k 即可,不盲目放大
large_client_header_buffers 必须配套设
它不和 client_header_buffer_size 叠加使用,而是“换一块更大的内存”来重试解析。关键规则是:单个 buffer 大小 ≥ 前者:
- 推荐组合:
large_client_header_buffers 4 8k(4 个缓冲,每个 8KB) - 若前者设为 8k,则后者至少得是
4 8k或2 16k,否则扩容逻辑压根不触发 - 严禁设成
1 64k或1 1m——攻击者可构造单行超长头反复建连,快速耗尽 worker 进程堆内存
别漏掉配套加固项
光调缓冲区只是基础,还得堵住其他入口:
-
client_header_timeout 5s;防慢速攻击,避免逐字节发头拖住连接 -
underscores_in_headers off;禁用下划线解析,防止X_Api_Key被误当成X-Api-Key绕过鉴权 - 对 URI 过长的请求,用
if ($request_uri ~ "^.{8192,}$") { return 414; }提前拦截,不进缓冲分配流程 - 启用 HTTP/2 时,必须额外加
http2_max_header_size 32k;和http2_max_field_size 4k;,否则前面配置无效
配置位置统一放在 http 块顶层或具体 server 块内,确保生效范围准确。改完记得 nginx -t 校验再 reload。


















