今天在nginx中增加了一个域名后,停止nginx并重启,结果停在的时候nginx报错:

Could not build the server_names_hash,you should increase server_names_hash_bucket_size:32


查了官方帮助,原来是定义的名字太长,默认为32,改大点,最后以2的倍数增长。

在nginx.conf文件中的http中添加或者修改 server_names_hash_bucket_size  64;或者更大。



以下引用官方文档片段 http://nginx.org/cn/docs/http/server_names.html  :

---------------------------------------------------------

如果定义了大量名字,或者定义了非常长的名字,那可能需要在http配置块中使用server_names_hash_max_sizeserver_names_hash_bucket_size指令进行调整。server_names_hash_bucket_size的默认值可能是32,或者是64,或者是其他值,取决于CPU的缓存行的长度。如果这个值是32,那么定义“too.long.server.name.example.org”作为虚拟主机名就会失败,而nginx显示下面错误信息:

could not build the server_names_hash,
you should increase server_names_hash_bucket_size: 32

出现了这种情况,那就需要将指令的值扩大一倍:

http {
    server_names_hash_bucket_size  64;
    ...

如果定义了大量名字,得到了另外一个错误:

could not build the server_names_hash,
you should increase either server_names_hash_max_size: 512
or server_names_hash_bucket_size: 32

那么应该先尝试设置server_names_hash_max_size的值差不多等于名字列表的名字总量。如果还不能解决问题,或者服务器启动非常缓慢,再尝试提高server_names_hash_bucket_size的值。

如果只为一个监听端口配置了唯一的主机,那么nginx就完全不会测试虚拟主机名了(也不会为监听端口建立哈希表)。不过,有一个例外,如果定义的虚拟主机名是一个含有捕获组的正则表达式,这时nginx就不得不执行这个表达式以得到捕获组。