先要将切确名字和通配符名字存储在散列表中,散列表和监听端口关联,每个端口都最多关联到三张表:确切名字的散列表、以星号
起始的通配符名字的散列表和以星号结束的通配符散列表。散列表的尺寸在配置阶段进行了优化,可以以最小的CPU缓存命中失败来找
到名字。
nginx首先会搜索确切名字的散列表,如果没有找到,则搜索以星号起始的通配符名字的散列表,如果还是没有找到,继续搜索以星号
的通配符名字的散列表。注意.nginx.org存储在通配符名字的散列表中,而不在确切名字的散列表中。由于正则表达式是一个一个串行
测试的,因此该方式也是最慢的,而且不可扩展的。鉴于以上原因,请尽可能使用确切的名字。
举例:
如果使用heboan.com和www.heboan.com来访问服务器最频繁,那么将他们明确地定义就更为有效
server {
listen 80;
server_name heboan.com www.heboan.com *.heboan.com;
......
}
下面这种方法相比更简单,但是效率也是最低的
server {
listen 80;
server_name .heboan.com;
......
}
如果定义了大量的名字,或者定义了非常长的名字,那么就需要在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_name_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_name_hash_bucket_size: 32
那么应该先尝试设置server_names_hash_max_size的值,此值差不多等于名字散列表的名字总量。如果还不能解决问题,或者服务器启动非常缓慢,再尝试
添加server_name_hash_bucket_size的值
每天进步一点,加油!