必须同时调大 client_header_buffer_size 和 large_client_header_buffers 才能支持超大 cookie,因 nginx 要求单行请求头(如 cookie)必须完整装入一个缓冲区,仅增大前者而后者单 buffer 不足仍会返回 400。

直接调大 client_header_buffer_size 不足以解决问题,必须配合 large_client_header_buffers 才能真正支持超大 Cookie。Nginx 在解析请求头时,对单行(比如整条 Cookie: 字段)有硬性长度限制——它必须能完整装进一个缓冲区,否则立刻返回 400。
为什么单设 client_header_buffer_size 不够
Nginx 使用两级缓冲机制:
-
第一级:用
client_header_buffer_size存储常规请求头,如 User-Agent、Host 等,也用于存放首条 Cookie 行; -
第二级:当某一行(例如含 JWT、多域 Token、埋点参数的 Cookie)超出第一级大小,Nginx 会尝试分配
large_client_header_buffers中的一个缓冲区来承接它; - 但如果
large_client_header_buffers中单个 buffer 的大小 ≤client_header_buffer_size,扩容失败,仍报 400。
负载均衡场景下的推荐配置
在 Nginx 作为反向代理或负载均衡器时,需在 http 块中统一设置,确保所有后端服务一致生效:
-
client_header_buffer_size 8k;—— 提升初始缓冲,覆盖多数长 Cookie 场景; -
large_client_header_buffers 4 16k;—— 允许最多 4 个扩容缓冲,每个最大 16KB,单行最长可容纳约 16KB(实际略小,含换行符等开销); - 两个值需满足:
client_header_buffer_size ≤ large_client_header_buffers中的单 buffer 大小,否则扩容逻辑不触发。
验证与安全注意事项
修改后务必执行两步操作:
- 运行
nginx -t检查语法是否正确; - 执行
sudo nginx -s reload平滑重载配置; - 避免无节制放大(如设为
64k单 buffer),否则可能被用于慢速攻击(slowloris 类型),消耗内存资源; - 若日志中同时出现
414 Request-URI Too Large,说明请求行(如超长路径)也超限,需确认large_client_header_buffers的单 buffer 足够承载 URI + 请求头整体。
前端协同优化建议
仅靠 Nginx 调参是治标,长期应减少 Cookie 膨胀:
- 将非必要追踪参数、调试信息移出 Cookie,改用 localStorage 或请求体携带;
- SSO 场景下,Token 尽量精简或采用引用式(token_id)代替原始凭证;
- 避免多个子域重复写入相似 Cookie,合并或设置更精准的 Domain 属性。











