nginx中large_client_header_buffers需置于server块顶层,单buffer大小须≥最长单行请求头(如jwt、cookie),数量兼顾并发与安全,并同步配置client_header_buffer_size及http/2相关参数。

在 Nginx 的 server 块中设置 large_client_header_buffers,核心目标是让 Nginx 能完整接收并解析超长请求头(如大 Cookie、长 JWT、多层代理透传的 Header),避免返回 400 Bad Request 或 414 URI Too Long 错误。这不是简单调大数值,而是需匹配真实请求结构、遵守缓冲机制规则,并与配套参数协同生效。
必须放在 server 块顶层,不能嵌套在 location 内
该指令只在 http 或 server 块顶层生效;写在 location 里会被忽略。例如:
✔ 正确位置:
server {
listen 80;
server_name example.com;
<pre class="brush:php;toolbar:false;">client_header_buffer_size 4k;
large_client_header_buffers 4 16k; # ← 放在这里
location / {
proxy_pass http://backend;
}}
✘ 错误写法:
若写在 location 内,Nginx 不识别,仍使用默认值 4 8k,问题照旧。
按实测最长单行头长度设单 buffer 大小
Nginx 不允许跨 buffer 拼接一行请求头(如整条 Cookie: 或 Authorization:)。因此,large_client_header_buffers 的第二个参数(单 buffer 大小)必须 ≥ 实际最长单行头长度。
- 用
$request_length日志定位:在log_format中加入该变量,复现报错请求,查 access log 中status=400或414对应的值 - 若多数异常请求的
$request_length集中在 10–14KB,说明单行头常超 8KB → 单 buffer 至少设为16k - 若发现个别请求达 28KB(如含 base64 设备指纹的 IoT 上报),则单 buffer 需设为
32k或更高
数量与大小需兼顾并发和安全
第一个参数(数量)决定最多可分配几个同规格 buffer,影响并发连接的内存占用:
- 普通 Web 应用(含 SSO/JWT):
4 16k(总容量约 64KB,平衡够用与防护) - 微服务网关或需透传大量
X-Forwarded-*的场景:可设8 16k,但必须推动上游精简 Header - 严禁盲目设成
8 64k或更大:每个连接独占 buffer,易被 slowloris 类攻击耗尽内存
必须同步配置 client\_header\_buffer\_size
它和 large_client_header_buffers 是两级协作关系:
-
client_header_buffer_size是首块缓冲区,推荐设为4k或8k(覆盖 95% 合法请求) - 其值必须 ≤
large_client_header_buffers的单 buffer 大小(如设了4 16k,则它最多为16k) - Nginx 启动时会校验该约束,不满足则
nginx -t报错
HTTP/2 场景需额外配置
若 server 块启用了 http2(如 listen 443 ssl http2;),仅调 large_client_header_buffers 无效:
- 必须添加:
http2_max_header_size 32k;(控制整个请求头总长) - 还需设置:
http2_max_field_size 8k;(控制单字段上限,JWT 过长时重点调这个) - 这些指令同样须放在
server块顶层











