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


13

我有以下虚拟主机

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个虚拟主机)


的内容是grep "" /sys/devices/system/cpu/cpu?/cache/index?/coherency_line_size什么?
哈维尔·卢卡斯

@XavierLucas:/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size:64 /sys/devices/system/cpu/cpu0/cache/index1/coherency_line_size:64 /sys/devices/system/cpu/cpu0/cache/index2/coherency_line_size:64
维吉留2015年

Answers:


11

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

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

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

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

Vim说fileencoding = utf-8。我使用iconv进行了转换,以确保编码为UTF8,但nginx行为没有任何变化。也许我的VPS的CPU的缓存行大小非常​​小,我有什么办法检查它,它的合理值是多少?
Virgiliu 2015年

合理的值是nginx将成功启动的最小的2的幂。如果您有VPS,那么它几乎可以做任何事情……
Michael Hampton

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.