关键是要协同调整large_client_header_buffers(如4 16k)、client_header_buffer_size(如2k)、client_max_body_size(如10m)和client_header_timeout(如60),否则仍可能因缓冲区不足返回400或414错误。

要让 Nginx 正确处理带大 JWT Token 的 HTTPS 请求,关键不是单纯调大 large_client_header_buffers,而是需配合其他相关参数协同调整,否则仍可能返回 400 错误(Bad Request)或 414(URI Too Long)。
为什么大 Token 会触发 400?
JWT Token 通常放在 Authorization: Bearer xxx 请求头中。当 Token 超过 Nginx 默认的请求头缓冲区大小(默认 8KB),Nginx 无法完整读取该 header,直接拒绝请求并返回 400。注意:这不是 SSL/TLS 层问题,而是 HTTP 解析阶段的限制。
核心配置项及推荐值
在 http 或 server 块中设置以下参数(单位均为字节):
-
large_client_header_buffers 4 16k;表示最多分配 4 个缓冲区,每个 16KB;总容量 = 4 × 16k = 64KB。建议从4 12k或4 16k起步,避免过度分配内存。 -
client_header_buffer_size 2k;初始缓冲区大小,应小于large_client_header_buffers中单个 buffer 大小(如设为 2k,对应上面的 16k 是合理的)。 -
client_max_body_size 10m;虽然 Token 在 header 中,但若请求体也较大(如上传含 Token 的表单),此值也要同步放宽。 -
client_header_timeout 60;防止因大 header 解析慢导致超时中断(默认 60 秒通常够用,可按需微调)。
HTTPS 场景下的额外注意事项
HTTPS 本身不改变 header 处理逻辑,但需确认:
- SSL 握手成功后,HTTP 请求才开始解析 —— 所以 TLS 配置(如证书、协议版本)不影响 header 缓冲,无需为此调整
ssl_buffer_size等参数。 - 如果使用 CDN(如 Cloudflare)或前置 LB(如 ALB),确保它们也支持大 header;否则 Nginx 收到的请求可能已被截断,此时调 Nginx 参数无效。
- 某些客户端(如老版本 curl、Postman)在发送极长 header 时可能自动分段或折叠,建议用
curl -v -H "Authorization: Bearer $(cat token.txt)" https://api.example.com实测验证。
验证是否生效
修改配置后重载 Nginx(nginx -s reload),再通过以下方式确认:
- 用含大 Token 的请求测试接口,观察是否还返回 400/414;
- 开启 Nginx error log 的
info级别(error_log /var/log/nginx/error.log info;),出现client sent too large header即说明仍不足; - 临时加
log_format full '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_authorization"';查看实际收到的 Authorization 长度(注意日志脱敏)。

















