431错误主因是HTTP/2下请求头超限,需调高nginx的http2_max_header_size(默认16KB),并同步调整http2_max_field_size、max_headers等参数,后端也需匹配限制。
当后端服务(如 FastAPI、Node.js)返回
431 Request Header Fields Too Large
,而你确认是因 JWT Token 过长(比如含大量声明、嵌套对象或签名膨胀)导致,问题通常出在 Nginx 对 HTTP/2 请求头总大小的限制上——
是关键开关。
确认是否是 http2_max_header_size 触发的 431
该错误只在启用 HTTP/2 的 server 块中生效。先检查配置里是否有:
(或
关键字存在)
未显式设置
,则走默认值 16KB(16384 字节)
用
模拟大 header,观察是否返回 431 并在 error.log 中出现
client sent too large header while reading header
合理调高 http2_max_header_size
JWT 实际体积受算法、payload 字段数、签名长度影响。常见 JWT(含用户信息+权限+多级 trace 头)可能达 8–25KB。建议按场景分级设置:
纯内部 API 网关、JWT 含完整用户上下文:设为
或
对外轻量接口、仅基础鉴权:保持默认
即可
不建议超过
,否则失去防御意义,且可能被用于内存耗尽攻击
配置示例(放在
或
块内):
Nginx
在宝塔面板中轻松管理Nginx高性能Web服务器。提供可视化配置反向代理、负载均衡、SSL证书及HTTP缓存功能,一键优化高并发性能,助您高效搭建稳定、快速的网站运行环境。
下载
http2_max_header_size 32k;
必须同步检查的关联参数
单调大
不够,还需覆盖其他头部限制点:
:防单个超长 header(如一个 30KB 的
),默认 4k,建议同步设为
(Nginx 1.29.8+):防“大量小 header”攻击(如 2000 个
),默认 1000 行,可设为
~
更稳妥
后端自身限制也要匹配:如 Node.js 需加启动参数
;FastAPI/Uvicorn 无直接等效项,但应确保其反向代理前的 Nginx 已拦截,避免透传异常 header
验证配置是否真正生效
改完配置后执行:
查看
是否还有相关报错
用真实带长 JWT 的请求测试(不要只测人工拼接字符串,要复现生产 token 结构)
注意:HTTP/1.1 请求不受
影响,它只作用于启用了
的连接
http2_max_header_sizelisten 443 ssl http2;http2http2_max_header_sizecurl -v --http2 -H "Authorization: Bearer $(python3 -c 'print(\"a\"*20000)')" https://yoursite.com32k64k16k128khttpserverhttp2_max_header_sizehttp2_max_field_sizeCookie32kmax_headersX-Trace-Id-*500800--max-http-header-size=32768nginx -t && nginx -s reloaderror.loghttp2_max_header_sizehttp2