跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何配置 Nginx http2_max_header_size 处理由于 JWT 过长导致的 431 报错

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

相关文章