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

我有以下虚拟主机

server { server_name abc.example.com; root /var/www/test/; index index.html; } 

在运行nginx -s reload ,出现以下错误:

nginx:[emerg]无法build立server_names_hash,你应该增加server_names_hash_bucket_size:32

对于具有15个或更多字符的任何server_name,情况也是如此。

如果我将server_name设置为ab.example.com (或15个字符ab.example.com任何名称),则问题将停止显示。

为了解决这个问题,我在/etc/nginx/nginx.conf (以前没有定义)中添加了以下内容:

 server_names_hash_bucket_size 64; 

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

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

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

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

server_name 太大而不能放入散列桶时,会发生此错误。

server_names_hash_bucket_size的默认值取决于服务器的CPU高速caching行大小。 特别是它要尽可能小, 以减lessCPUcaching未命中 ,因为server_name必须在每个请求上查找。

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

  • 您的configuration文件使用UTF-16编码(或其他编码)而不是UTF-8,这会导致在原始数据中的每个字符之前或之后出现空值,并将其大小加倍。 如果您在Windows上编辑文件,可能会发生这种情况。 如果是这种情况,请使用iconv东西来修复它。
  • 你已经遇到了nginx中的一个未知的bug。

缺省长度应在启动时自动确定,具体取决于所使用的服务器名称,但在reload操作期间也应该更新。 看看它是否工作,而无需手动设置桶大小,但重新启动,而不是重新加载。

请参阅http://nginx.org/en/docs/hash.html以了解如何确定散列大小,并参阅http://nginx.org/en/docs/http/server_names.html以了解用于服务器名称的散列。