参考资料
[1]. 跟老男孩学Linux运维:Web集群实战,老男孩先要
安装过程
将确切名字和通配符名字存储在散列表中,散列表和监听端口关联,每个端口都是最多关联到三张表:确切名字的散列表、以星号起始的通配符名字的散列表和以星号结束的通配符名字的散列表。散列表的尺寸在配置阶段进行了优化,可以以最小的CPU缓存命中失败来找到名字。Nginx首先会搜索确切名字的散列表,如果没有找到,则搜索以星号起始的通配符名字的散列表,如果还是没有找到,继续搜索以星号结束的通配符名字的散列表。因为名字是按照域名的字节来搜索的,所以搜索通配符名字的散列表比搜索确切名字的散列表慢。注意.nginx.org 存储在通配符名字的散列表中,而不在确切名字的散列表中。由于正则表达式是一个个串行测试的,因此该方式也是最慢的,而且不可扩展的。
鉴于以上原因,因尽可能使用确切名字,举个例子,如果使用nginx.org和www.nginx.org来访问服务器是最频繁的,那么将它们明确地定义出来就更为有效,如下:
server {
listen 80;
server_name nginx.org www.nginx.org *.nginx.org
...
}
下面的这种方法更简单,但是效率也更为低下
server {
listen 80;
server_name .nginx.org
...
}
如果定义了大量的名字,或者定义了非常长的名字,那就需要在HTTP配置块中调整server_names_hash_max_size和server_names_hash_bucket_size的值。server_names_hash_bucket_size的默认是可能是32或64,也可能是其他值,这取决于CPU的缓存行的长度。如果这个值是32,那么定义”too.long.server.name.nginx.org”作为虚拟主机名就会失败,此时会显示下面的错误信息。
could not build the server_names_hash,
you should increase server_names_bucket_size:32
出现了这种情况,那就需要将设置值扩大一倍,命令如下:
http {
server_names_hash_bucket_size 64;
}
如果定义了大量名字,则会得到如下另外一个错误信息:
could not build the server_names_hash,
you should increase server_names_hash_max_size: 512
or server_names_hash_bucket_size: 32
那么应该先尝试设置server_names_hash_max_size 的值,此值差不多等于名字列表的名字总量。如果还不能解决问题,或者服务器启动非常缓慢,再尝试增加server_names_hash_bucket_size 的值,具体信息如下:
http {
# 默认是512kb,一般要查看系统给出确切的值,这里一般是cpu L1的4-5倍。
server_names_hash_max_size 512;
}
server_names_hash_max_size的官方说明如下:
syntax: server_names_hash_max_size size; ## 参考语法
default: server_names_hash_max_size 512; ## 默认设置
context: http ## 仅设置在http标签段
参数作用:设置存放域名(server names)的最大散列表的大小,细节见http://nginx.org/en/docs/ngx_core_module.html
第二个参数如下:
http {
server_names_hash_bucket_size 128;
}
注:不能带单位,配置主机时必需设置该值,否则无法进行Nginx,或者无法通过测试。该设置与server_names_hash_max_size共同控制保存服务器名的HASH表,hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。若hash bucket size 等于一路处理器缓存的大小,那么在查找键时,最坏的情况下在内存中查找的次数为2.第一次是确定存储单元的地址,第二次是在存储单元中查找键值。若报出hash max size 或 hash bucket size 的提示,则需要增加server_names_hash_max_size的值。
server_names_hash_bucket_size的官方说明如下:
syntax: server_names_hash_bucket_size size; ## 参考语法
default: server_names_hash_bucket_size 32|64|128; ## 默认设置
context: http ## 仅设置在http标签段
参数作用:设置存放域名(server names)的最大散列表的存储桶(bucket)的大小。默认值依赖CPU的缓存行。细节见http://nginx.org/en/docs/ngx_core_module.html