http2_max_field_size 在 Nginx 1.29.8+ 中已被废弃,由 large_client_header_buffers 统一管控请求头各层级长度限制;其替代配置需结合 client_header_buffer_size,并通过超长 header 实测 400 错误验证生效。

这个指令在较新版本的 Nginx(1.29.8+)中已被废弃,不再起作用。它原本用于限制单个 HTTP/2 header 字段解码后的最大长度,默认值是 4KB。但当前主流版本已用 large_client_header_buffers 统一接管该职责。
为什么 http2_max_field_size 不再有效
官方文档和实际运行日志都会明确提示:[warn] the "http2_max_field_size" directive is obsolete, use the "large_client_header_buffers" directive instead。Nginx 已将字段级、行级、整体请求头缓冲的控制逻辑整合进 large_client_header_buffers,使其同时约束:
- 每个 header 字段(如
Authorization、Cookie)的长度上限 - 请求行(例如
GET /path?query HTTP/2)的长度上限 - 所有 header 字段总和的隐含上限(由数量 × 单个 size 决定)
替代方案:正确配置 large_client_header_buffers
该指令语法为 large_client_header_buffers numbersize,推荐按场景设置:
- 常规 Web 服务:保持默认
large_client_header_buffers 4 8k - 含长 JWT 或多级追踪头(如 OpenTelemetry)的 API 网关:设为
large_client_header_buffers 8 32k - 内部可信调用链、调试环境:可设为
large_client_header_buffers 16 64k,但不建议长期用于公网入口
注意:第一个数字是缓冲区个数,第二个是每个缓冲区大小;单个 header 字段若超过 size 值,Nginx 将直接返回 400 错误(实际底层为 494,但对外统一映射为 400)。
配合 client_header_buffer_size 使用
client_header_buffer_size 是首层快速缓冲,用于存放典型尺寸的请求头(默认仅 1KB)。当请求头未超此值,Nginx 直接处理;一旦超出,就启用 large_client_header_buffers 进行后续解析。
- 建议将其设为与
large_client_header_buffers的单个 size 一致,例如都设为32k - 这样可避免因首层缓冲过小导致的无谓切换,提升解析效率
验证是否生效的方法
不要只看配置是否写对,要实测响应行为:
- 用 curl 构造超长单字段 header:
curl -v -H "X-Test: $(printf 'a%.0s' {1..40000})" https://yoursite.com - 观察返回状态码:应为 400(不是 431,431 是
http2_max_header_size触发的) - 检查 error.log:出现
client sent too large header while reading header表示限制已触发 - 确认 Nginx 版本:
nginx -v,确保 ≥1.29.8,否则旧版仍识别http2_max_field_size











