http2_max_header_size仅在listen 443 ssl http2的server块中生效,建议设为32k并同步配置http2_max_field_size,需重启Nginx且须结合后端校验与限流形成完整防护。

直接在启用 HTTP/2 的 server 块中设置 http2_max_header_size,值建议设为 32k 或根据业务头部实际大小略留余量,配置后必须重启 Nginx 生效,并配合 http2_max_field_size 和后端校验才能形成有效防护。
确认前提:只对 HTTP/2 连接生效
该指令仅在配置了 listen 443 ssl http2; 的 server 块中起作用。如果只监听 80 端口、或未启用 http2 标志,设置无效。HTTP/1.1 请求不受此参数影响,其头部限制由 client_header_buffer_size 和 large_client_header_buffers 控制。
正确配置方式与常见位置
在对应 HTTPS server 块内添加:
server {
listen 443 ssl http2;
server_name example.com;
<pre class='brush:php;toolbar:false;'>ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
http2_max_header_size 32k;
http2_max_field_size 4k; # 建议同步设置,防单字段膨胀
http2_max_requests 1000; # 防止单连接长期复用被滥用}
- 单位支持
k(千字节)、m(兆字节),如32k、1m - 不建议设得过大(如超过 64k),否则可能增加内存开销和 DoS 风险
- 不能放在
http或location块中,只接受在server级别声明
验证是否生效的两种方法
配置保存后执行 nginx -t && nginx -s reload,再通过以下方式确认:
-
查错误日志:向服务发送超限请求(如 header 总长 >32k),Nginx 错误日志应出现
client sent too large header while reading header -
用 curl 测试响应码:
curl -v --http2 -H "X-Test: $(printf 'a%.0s' {1..40000})" https://example.com
成功拦截时返回431 Request Header Fields Too Large(注意不是 400)
不能只靠它,还要组合防御
http2_max_header_size 只管解压后整个 header 列表体积,但攻击者可能绕过它:
- 单个 header 值极长(如 Cookie 超 4k)→ 需
http2_max_field_size - 高频发小 header 请求耗尽连接 → 需
limit_req限速 - Nginx 拦截失败或透传异常数据 → 后端应用层仍需做 header 长度校验(如 Spring 的
server.max-http-header-size) - 临时文件写入失败也可能导致 header 处理异常 → 确保
client_body_temp路径可写


















