必须在http块顶层配置server_names_hash_bucket_size,因其是全局哈希表参数,用于预分配所有server_name的匹配索引,写在server或location块中会被忽略或报错;数值须为2的幂(如64、128、256),并依据最长域名长度向上取整。

不能在 server 块中配置 server_names_hash_bucket_size。
这个参数只允许出现在 http 块顶层,写在 server、location 或任何嵌套块里都会被 Nginx 忽略,甚至导致配置校验失败(nginx -t 报错)。
为什么必须放在 http 块?
Nginx 在启动时,先一次性构建所有 server_name 的哈希表,用于快速匹配请求中的 Host 头。这个哈希表是全局的、预分配的,不按每个 server 块单独建表。所以控制桶大小的 server_names_hash_bucket_size 是全局配置项,作用于整个 HTTP 模块。
正确配置方式
打开主配置文件(如 /etc/nginx/nginx.conf 或 C:\phpEnv\nginx\conf\nginx.conf),在 http { ... } 块开头、第一个 include 语句之前添加:
http {
server_names_hash_bucket_size 128;
# 可选:如果域名数量极多(上百个),再加这一行
# server_names_hash_max_size 2048;
include /etc/nginx/conf.d/*.conf;
# 其他配置...
}-
128是常见安全值,适配绝大多数现代域名(如api.v2.internal.staging.company-name.example.com); - 若最长
server_name是 47 字符 → 设 64;接近 110 字符 → 直接设 128;超 120 → 设 256; - 数值必须是 2 的幂(32、64、128、256…),不是 32 的倍数即可(旧文档说法已过时)。
常见错误 & 排查步骤
✅ 错误:把
server_names_hash_bucket_size 128;写进某个server { }里
→ Nginx 启动时会静默忽略,或报unknown directive(取决于版本)✅ 错误:改完没运行
nginx -t就 reload
→ 一定要先验证:nginx -t -c /path/to/nginx.conf✅ 错误:多个
include引入了重复定义,覆盖了你的设置
→ 确保它写在http块最开始,且没被其他配置覆盖-
✅ 报错提示示例:
could not build the server_names_hash, you should increase server_names_hash_bucket_size: 64
→ 说明当前值不够,直接翻倍试(64 → 128 → 256)
补充:什么情况下还要调 server_names_hash_max_size?
仅当同时满足以下两点时才需调整:
- 定义了 大量不同域名(比如 300+ 个独立
server_name) -
nginx -t报错含max_size关键词,例如:could not build the server_names_hash, you should increase either server_names_hash_max_size: 512 or ...
此时可配合调大:
server_names_hash_max_size 2048; server_names_hash_bucket_size 128;
不复杂但容易忽略


















