10.4 server的快速检索

在10.2.2节中可以看到,每一个虚拟主机server{}配置块都由一个ngx_http_core_srv_conf_t结构体来标识,这些ngx_http_core_srv_conf_t又是通过全局的ngx_http_core_main_conf_t结构中的servers动态数组关联起来的。这意味着当开始处理一个HTTP新连接时,接收到HTTP头部并取到Host后,需要遍历ngx_http_core_main_conf_t的servers数组才能找到与server name配置项匹配的虚拟主机配置块,这样的时间复杂度显然是不可接受的,因为当nginx.conf配置文件中拥有数以百计的server{}块时,查询效率就太低了。于是,HTTP框架使用了第7章中介绍过的散列表来存放虚拟主机,其中每个元素的关键字是server name字符串,而值则是ngx_http_core_srv_conf_t结构体的指针。

在10.3节中介绍过,负责监听一个端口地址的ngx_http_conf_addr_t结构体拥有下面3个成员:hash、wc_head、wc_tail,这3个成员对应着7.7.3节中介绍过的带通配符的散列表。这个带通配符的散列表的使用方法(包括如何构造、检索)在7.7节中已详细描述过,这里不再赘述。