必须放在http块顶层,因其作用于Nginx初始化时构建的全局server name哈希表,仅在http上下文中生效;写在server或location块内会被忽略且不报错。

直接在 http 块顶层配置 server_names_hash_bucket_size,值需根据最长 server_name 长度设定,不能放在 server 或 location 块内。
为什么必须放 http 块顶层
这个参数作用于 Nginx 初始化时构建的全局 server name 哈希表,只在 http{} 上下文中生效。写在 server{} 里会被忽略,Nginx 启动时既不报错也不起作用。
- 错误位置示例:
server { server_names_hash_bucket_size 64; ... }→ 无效 - 正确位置示例:
http { server_names_hash_bucket_size 64; server { ... } }→ 生效 - 若使用 include 引入虚拟主机配置(如
include vhost/*.conf;),该参数必须在 include 语句之前定义
怎么确定合适的数值
取所有 server_name 指令中**最长的完整域名字符串长度**(含点号,不含引号和空格),向上取最近的 2 的幂,并加一点余量。
- 例如:
server_name api.v2.internal.prod.example.com;共 31 字符 → 设为64 - 例如:
server_name www.beta.us-west-2.app.long-service-name.company.co.uk;共 58 字符 → 设为64或保守设128 - 国际化域名(IDN)按 Punycode 编码后长度计算,通常更长,建议直接设
128起步
配置后必须验证和重载
改完配置不能直接 reload,必须先语法检查,再平滑重启。
- 运行
nginx -t:确认无“server_names_hash_bucket_size may be increased”类报错 - 若仍报错,说明值还不够大,翻倍尝试(如 64 → 128 → 256)
- 验证通过后执行
nginx -s reload,无需 stop/start - 注意:修改后不会影响已建立的连接,旧 worker 进程会自然退出
是否要同步调大 server\_names\_hash\_max\_size
一般不需要。这个参数控制哈希表最多能有多少个桶,默认 512 已满足绝大多数场景(几十个域名以内)。
- 仅当启动时报 “
could not build the server_names_hash” 且增大bucket_size无效时,才考虑调大max_size - 此时建议按需逐步翻倍:512 → 1024 → 2048,避免盲目设到 4096+ 浪费内存
- 调整
max_size时,bucket_size应保持 ≥64,两者协同才有效


















