需在http块顶层协同配置proxy_headers_hash_bucket_size和proxy_headers_hash_max_size,仅当nginx -t报错、头数量超15个、头名超64字节或后端收不到自定义头时才调整;bucket_size须为2的幂,按最长头名加1后取最近2的幂;max_size也须为2的幂,按唯一头数×bucket_size×1.5向上取最近2的幂;调参前应先精简冗余配置。

直接在 http 块顶层配置 proxy_headers_hash_bucket_size 和 proxy_headers_hash_max_size 两个参数,二者必须协同设置、同时生效,不能放在 server 或 location 里。
先确认是否真需要调参
不是所有代理场景都需要改。只在以下情况才需干预:
- 运行
nginx -t报错,如could not build the proxy_headers_hash或proxy_headers_hash_max_size overflow - 配置了 15 个以上不重复的
proxy_set_header或proxy_hide_header - 用了长 header 名,比如
X-Request-ID-Trace-UUID-V4、X-Auth-Signature-Sha256-Hmac-Base64,实测长度超 64 字节 - 后端收不到某些自定义头,且日志无明确错误——可能是静默截断
怎么设 proxy_headers_hash_bucket_size
它决定单个哈希桶能存多长的 header 名(含结尾 <p>它决定单个哈希桶能存多长的 header 名(含结尾 <code>\0),单位是字节,必须是 2 的幂:
- 默认 64,够用大多数短名(
Host、User-Agent) - 测出最长 header 名字节数:用
echo -n "X-Your-Header-Name" | wc -c,结果加 1 - 若最长为 65–128 字节,设为 128;超 128 但未满 256,设为 256
- 不要设成 100、192 这类非 2 的幂值,否则启动失败
怎么配 proxy_headers_hash_max_size
它控制整个哈希表最多分配多少个桶,影响冲突率和内存总量,也必须是 2 的幂:
- 统计所有
proxy_set_header和proxy_hide_header中不同的 key 数量(去重) - 估算下限:取
bucket_size × 唯一头数 × 1.5,再向上取最接近的 2 的幂 - 常见组合:
• 中等规模(15–40 个头):128 / 1024
• 大规模(40–100 个头):128 / 4096 或 256 / 4096
• 超大规模(100+ 长名头):256 / 16384 或 512 / 16384 - 避免盲目堆大,比如设
max_size 65536可能吃掉数 MB 内存/worker 进程
别跳过精简配置这步
调参前先清理冗余,往往比调数更有效:
- 删掉重复项,比如多个
proxy_set_header Host $host - 关闭默认透传:
proxy_pass_request_headers off;,再只显式写必需 header - 用
proxy_hide_header屏蔽后端返回的敏感或大体积头(如Set-Cookie、Server) - 把共用 header 收敛到
upstream块或全局http块,减少重复定义
改完执行 nginx -t 验证,无报错再 nginx -s reload。观察 error log 是否还有 hash 相关警告,再用一条极长 header 测试是否仍能正常转发。











