server_names_hash_max_size 是 nginx 控制 server_name 哈希表最大桶数的参数,用于优化虚拟主机匹配性能;默认 512 或 1024,需在哈希构建失败或域名多/长时适度调大,但不宜过大以免浪费内存。

server_names_hash_max_size 是 Nginx 在 http{} 块中用于优化虚拟主机(server name)匹配性能的一个关键哈希表参数,它不直接“解析”域名,而是影响 Nginx 如何高效查找匹配的 server{} 块。
作用本质是控制哈希桶数量上限
Nginx 将所有 server_name 指令声明的域名(如 example.com、*.test.org、~^www\..*)构建成一个哈希表,用于在请求到来时快速定位对应 server{} 块。server_names_hash_max_size 限制该哈希表最多可分配的桶(bucket)数量,默认值通常是 512 或 1024(取决于编译配置和实际域名总数)。
这个值不是越大越好——它只设上限,真正桶数由 Nginx 自动计算并尽量不超过该值,以平衡内存占用与冲突率。
需要调大的典型场景
当出现以下错误时,说明当前哈希表容量不足:
- 启动或重载失败,报错:
could not build the server_names_hash, you should increase server_names_hash_max_size -
server_name中包含大量长域名、通配符或正则表达式(尤其是多个~开头的 PCRE 形式) - 虚拟主机数量超过数百个,且域名字符总长度较大(比如含多级子域或国际化域名)
实际配置建议
- 先尝试小幅递增,例如从默认 512 → 1024 → 2048,每次 reload 观察是否成功
- 同时检查
server_names_hash_bucket_size(默认 32/64 字节),若单个域名超长(如带 port 或特殊字符),可能需同步调大该值 - 不必盲目设为 65536 这类极大值;过大会浪费内存,且对性能无益反而可能触发其他限制
示例配置片段
http {
server_names_hash_max_size 2048;
server_names_hash_bucket_size 128;
server {
listen 80;
server_name example.com www.example.com;
# ...
}
server {
listen 443 ssl;
server_name api.example.com *.staging.example.com;
# ...
}
}
它本身不参与请求路由逻辑判断,只是底层哈希结构的容量护栏。真正决定哪个 server{} 响应请求的,是 listen + server_name 的完整匹配规则(精确匹配 > 通配符 > 正则)。











