前言
我们知道,Nginx的配置文件的http块中一般会存在多个server块,每个server块中也会有多个locations块,而每个location块中也允许有多个location块。前面我们在分析http模块的配置结构体的时候也看到,这些块是通过上一级配置块对应的的ngx_http_core_module模块创建的配置结构体管理的。比如http块中的所有server块都是由ngx_http_core_module模块的ngx_http_core_main_conf_t->servers成员组织,server块和location块中的所有location块都是由ngx_http_core_module模块创建的ngx_http_core_loc_conf_s结构体的locations成员管理。其中servers是一个数组,locations是一个队列。
servers和locations的组织
一般一个NGINX上的支持的虚拟主机不会很多,所以server块的配置结构体就直接存在serves数组中,不需要做额外的处理了。但是location不同,location的作用是和请求的url匹配,然后利用匹配的location块的配置结构体来处理这个请求,而且一般location的数量比较多,因此,为了加速请求的url匹配到对应的location块,Nginx对每个locations队列都进行了重新组织,将每个locations队列重新单独组织成一个三叉树,并将这个三叉树存储到ngx_http_core_loc_conf_s结构体的static_locations中。这里需要额外提一句的是,locat