答案是需基于线上真实流量P95~P99请求头长度向上取整至1k/2k/4k设client_header_buffer_size,并同步配置large_client_header_buffers(单buffer≥前者),且必须置于http或server块顶层。

直接在 http 或 server 块里设 client_header_buffer_size 就行,关键不是随便调大,而是让初始缓冲刚好装下大多数真实请求头,避免频繁回退到备用缓冲区。
怎么确定该设多大
别猜,看线上真实数据:
- 在
log_format中加$request_length,用awk '{print $12}' access.log | sort -n | tail -100提取 P95~P99 的请求头长度 - 抓一个带 JWT 或长 Cookie 的典型请求,用
echo -n "GET / HTTP/1.1\r\nHost: a.com\r\nCookie: ... " | wc -c算出精确字节数 - 取 P99 值后向上取整到最接近的 1k、2k 或 4k ——比如实测是 2350 字节,就设
client_header_buffer_size 4k
必须同步配 large_client_header_buffers
只改 client_header_buffer_size 没用,还可能校验失败:
- 如果设了
4k,large_client_header_buffers至少得是2 4k或4 8k(单 buffer 大小 ≥ 初始值) - 不能写成
4 2k,否则超限时无法启用,直接报400 Bad Request - 常见安全组合:
client_header_buffer_size 4k;+large_client_header_buffers 4 8k;
配置位置和生效范围
这两个指令只能放在 http 或 server 块顶层,不支持 location:
- 全局生效:写在
http{}里,覆盖所有 server - 按域名或服务定制:写在某个
server{}里,只影响该虚拟主机 - 改完必须运行
nginx -t校验语法,再nginx -s reload生效
哪些场景需要调大
默认 1k 对多数网站够用,但以下情况建议升到 2k 或 4k:
- 登录接口返回带长 JWT 的
Authorization或Set-Cookie - 前端埋点头(如
X-Trace-ID、X-User-Data)较多 - 微服务网关需透传大量自定义 Header
- 多域 Cookie 合并后总长超过 1KB


















