为什么 nginx server_name 指令的最大长度为 14 个字符?

为什么 nginx server_name 指令的最大长度为 14 个字符?

我有以下虚拟主机

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阅读有关用于服务器名称的哈希值。

相关内容