要防止Nginx因请求头过大返回400错误,需协同配置client_header_buffer_size与large_client_header_buffers:前者设为实测最大请求头长度的1.2–1.5倍,后者单buffer大小须≥最长单行头长度且不低于前者,二者均须置于http或server块中,同时应从源头优化减少请求头膨胀。

要防止 Nginx 因请求头过大返回 400 错误,不能只调大 client_header_buffer_size,它只是缓冲机制的第一环;真正起决定作用的是它与 large_client_header_buffers 的协同配置。
先确认是不是请求头真超限
别凭经验设值,得看真实数据:
- 用浏览器 DevTools 的 Network 面板抓一个失败请求,复制完整的 Cookie 或 Authorization 字段,粘贴到编辑器里执行
echo -n "内容" | wc -c查字节数 - 注意 JWT、多级代理追加的 X-Forwarded-For、前端埋点注入的调试头,都可能让单行头轻松突破 4KB
- 错误日志中若出现 “client sent too long header line” 或 “request header or cookie too large”,基本可锁定是单字段超限
合理设置两个参数的组合值
client_header_buffer_size 是初始缓冲,large_client_header_buffers 是备用池——二者必须匹配:
-
client_header_buffer_size建议设为实测最大请求头长度的 1.2–1.5 倍(如测得最长 Cookie 为 3200 字节,可设为4k) -
large_client_header_buffers的单 buffer 大小必须 ≥ 最长单行头长度,推荐格式如4 16k(4 个缓冲区,每个 16KB),这样单个 Cookie 最长可达 16KB - 切忌
client_header_buffer_size 32k配large_client_header_buffers 2 8k——Nginx 启动会报错,因为前者不能超过后者单 buffer 的大小
配置位置与生效范围
这两个指令只能放在 http 或 server 块中,不能写在 location 里:
- 全局生效:写在
http块,适合统一策略的多站点 - 按域名控制:写在特定
server块,比如 API 服务需要更大缓冲,静态资源站保持默认即可 - 配置示例(放 server 块内):
client_header_buffer_size 4k;
large_client_header_buffers 4 16k;
比调参更关键的源头优化
加大缓冲是兜底手段,长期应减少请求头膨胀:
- 避免把 JWT、用户 profile JSON 直接塞进 Cookie;改用短 session ID + 服务端查库
- 对第三方 SDK(如 GA、Amplitude)产生的冗余 Cookie,通过子域名隔离或响应头
Set-Cookie控制域范围 - 后端在下发 Cookie 前检查长度,超 4KB 主动截断或拒绝,并记录告警
- 启用
underscores_in_headers off防绕过,设client_header_timeout 10s防慢速攻击


















