我有以下虚拟主机
server
{
server_name abc.example.com;
root /var/www/test/;
index index.html;
}
运行时nginx -s reload
出现以下错误:
nginx:[emerg] 无法构建 server_names_hash,您应该增加 server_names_hash_bucket_size:32
对于任何具有 15 个或更多字符的 server_name 也会发生同样的情况。
如果我将 server_name 设置为ab.example.com
(或任何少于 15 个字符的名称),问题就不会再出现。
为了解决这个问题,我添加了以下内容/etc/nginx/nginx.conf
(之前没有定义):
server_names_hash_bucket_size 64;
将其设置为 33 也可以,但设置为 32 则不行。
为什么server_name的默认最大长度是14个字符?
这个限制是由 nginx 的默认设置还是由其运行的系统施加的?
server_name 为 15 会对最大哈希桶大小产生什么影响?(系统上只定义了 4 个虚拟主机)
答案1
当server_name
太大,无法放入哈希桶。
默认值的server_names_hash_bucket_size
选择取决于服务器的 CPU 缓存行大小。具体来说,它应该尽可能小,减少 CPU 缓存未命中,因为server_name
每次请求时都必须查找 s。
至于为什么限制为 14 个字符而不是预期的 31 个字符,我怀疑有两种可能性:
- 您的配置文件采用的是 UTF-16 编码(或其他编码),而不是 UTF-8,这会导致原始数据中每个字符之前或之后出现空值,并使其大小加倍。如果您在 Windows 上编辑文件,则可能会发生这种情况。如果是这种情况,请使用类似方法
iconv
进行修复。 - 您在 nginx 中遇到了一个未知的错误。
答案2
默认长度应在启动时自动确定,具体取决于使用的服务器名称,但这也应在操作期间更新reload
。看看它是否能在不手动设置存储桶大小的情况下工作,而是重新启动而不是重新加载。
看http://nginx.org/en/docs/hash.html了解如何确定哈希大小以及http://nginx.org/en/docs/http/server_names.html阅读有关用于服务器名称的哈希值。