发布于2020/02/27更新于2024/7/5
$ sudo service nginx configtest nginx: [emerg] could not build server_names_hash, you should increase server_names_hash_bucket_size: 64 nginx: configuration file /etc/nginx/nginx.conf test failed
在使用NGINX时,如果配置server_name时使用了过长的域名,则在检查配置文件或启动服务/开启进程[*]时,会报出上面的提示。简单来说,这个提示表示:当前需要加载的配置文件中含有较长的域名,NGINX无法有效对其哈希,需要增加server_names_hash_bucket_size指令的数值。
根据官方文档对域名(server_name)优化的解释,为使NGINX在读取、解析、对比域名时能最大程度命中CPU缓存,对域名进行了哈希,并将域名存放在一个哈希表中(关于该哈希表的构造[*]);而位于http块级的server_names_hash_max_size和server_names_hash_bucket_size两个指令参数可用于控制这个哈希表的构造。一般来说,当配置文件中域名数量很多或存在较长域名时,需要调整这两个指令参数:
server_names_hash_max_size:一般根据配置文件中的域名个数来设定;server_names_hash_bucket_size:一般根据CPU缓存行大小设置,为2的幂次方,一般为32、64等。
根据开头给出的错误提示,配置文件中可能有较长的域名,如“toooooooo.looooooooong.server.name.example.org”。而当前server_names_hash_bucket_size的值为64,因此,需要将其设置为128,直接在NGINX的配置文件中的http块中添加该指令即可:
http {
server_names_hash_bucket_size 128;
...
}关于这两个指令的更多解释,还可以参考[*]。