需调大 proxy_headers_hash_bucket_size 和 proxy_headers_hash_max_size:bucket_size 取最长 header 名字节+1 且为 2 的幂,max_size 按唯一 header 数×bucket_size×1.5 向上取 2 的幂,二者须置于 http 块顶层。

遇到 could not build the proxy_headers_hash 或 hash bucket size overflow 这类错误,不是配置写错了,而是 Nginx 解析自定义请求头时哈希表空间不够。关键不在堆数值,而在匹配你实际用到的 header 名称长度和种类数。
先确认是否真要调参
别一看到警告就改配置。只有这些情况才需要动手:
- 执行
nginx -t报错,比如could not build the proxy_headers_hash, you should increase ... - 配置里用了 15 个以上不重复的
proxy_set_header或proxy_hide_header - header 名特别长,例如
X-Request-ID-Trace-UUID-V4、X-Tenant-Context-Signature-JWS,实测超 40 字节 - reload 后部分 location 的 header 没生效,或日志反复出现 hash 相关 warning
算出合适的 bucket_size
这个值决定单个哈希桶能存多长的 header 名(含结尾 <p>这个值决定单个哈希桶能存多长的 header 名(含结尾 <code>\0)。它必须是 2 的幂,且 ≥ 最长 header key 的字节数 + 1。
- 用命令测真实长度:
echo -n "X-Your-Longest-Header" | wc -c,结果加 1 就是下限 - 默认 64 足够应付
X-Forwarded-For、Host这类常规名 - 若最长 key 达 50 字节,设为 128;若含 Base64 或 UUID 拼接(如
X-Sig-Base64-Encoded-...),可设 256 - 不要设 100、192 这类非 2 的幂数值,Nginx 会拒绝加载
定好对应的 max_size
它不是“能写多少行 header”,而是哈希表最多分配多少个桶,影响冲突率和内存占用。需和 bucket_size 配合使用。
- 统计所有
proxy_set_header和proxy_hide_header中不重复的 key 总数(大小写、中划线/下划线不同都算不同) - 简单估算:取
bucket_size × 唯一 key 数 × 1.5,再向上取最接近的 2 的幂 - 常见组合:
– 中等规模(≤100 个唯一 header,名称平均 ≤40 字节):128 / 1024
– 大规模(200–500 个,含长名):128 / 2048 或 4096
– 超大规模多租户网关(≥500 个):256 / 8192 或 16384
写法与验证要点
两个参数必须一起放在 http{} 块最顶层,不能嵌套在 server 或 location 里。
- 正确示例:
http {<br> proxy_headers_hash_bucket_size 128;<br> proxy_headers_hash_max_size 4096;<br> # 其他配置...<br>} - 改完立刻执行
nginx -t,通过后再nginx -s reload - 验证是否生效:
– error log 不再出现 hash 类 warning
– 加一条极长测试 header(如proxy_set_header X-Test-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX "1")仍能加载成功
– 压测时响应头完整、无静默丢失


















