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

Vir*_*liu 13 configuration nginx

我有以下虚拟主机

server
{
  server_name abc.example.com;
  root /var/www/test/;
  index index.html;
}
Run Code Online (Sandbox Code Playgroud)

运行时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;
Run Code Online (Sandbox Code Playgroud)

将其设置为 33 也可以,但不是 32。

为什么 server_name 的默认最大长度为 14 个字符?

这个限制是由 nginx 的默认设置还是由它运行的系统强加的?

server_name 为 15 如何影响最大哈希桶大小?(系统上只定义了 4 个虚拟主机)

Mic*_*ton 11

当出现此错误server_name太大,不适合在散列桶

server_names_hash_bucket_size根据服务器的 CPU 缓存行大小选择默认值。特别是它意味着尽可能小,以减少 CPU 缓存未命中,因为server_name必须在每个请求中查找 s。

至于为什么限制为 14 个字符而不是预期的 31 个字符,我怀疑有两种可能性之一:

  • 您的配置文件采用 UTF-16 编码(或某种其他编码)而不是 UTF-8,这会导致在原始数据中的每个字符之前或之后出现空值,并且其大小加倍。如果您在 Windows 上编辑文件,则可能会发生这种情况。如果是这种情况,请使用类似的iconv方法修复它。
  • 您在 nginx 中遇到了一个未知错误。


Sve*_*ven 6

默认长度应在启动期间自动确定,取决于使用的服务器名称,但也应在reload操作期间更新。看看它是否可以在不手动设置存储桶大小但重新启动而不是重新加载的情况下工作。

http://nginx.org/en/docs/hash.html学习如何散列大小的决定和http://nginx.org/en/docs/http/server_names.html阅读有关用于服务器名称哈希。