4.3.3 如何合并配置项

在4.3.1节描述的http配置项处理序列图(图4-1)中可以看到,在第20步,HTTP框架开始合并http{}、server{}、location{}不同块下各HTTP模块生成的存放配置项的结构体,那么合并配置的流程是怎样进行的呢?本节将简单介绍这一工作流程,而在10.2.4节中会利用源代码完整地说明它。

图4-4是合并配置项过程的活动图,它主要包含四大部分内容。

❑如果HTTP模块实现了merge_srv_conf方法,就将http{……}块下create_srv_conf生成的结构体与遍历每一个server{……}配置块下的结构体做merge_srv_conf操作。

❑如果HTTP模块实现了merge_loc_conf方法,就将http{……}块下create_loc_conf生成的结构体与嵌套的每一个server{……}配置块下生成的结构体做merge_loc_conf操作。

❑如果HTTP模块实现了merge_loc_conf方法,就将server{……}块下create_loc_conf生成的结构体与嵌套的每一个location{……}配置块下create_loc_conf生成的数据结构做merge_loc_conf操作。

❑如果HTTP模块实现了merge_loc_conf方法,就将location{……}块下create_loc_conf生成的结构体与继续嵌套的每一个location{……}配置块下create_loc_conf生成的数据结构做merge_loc_conf操作。注意,这个动作会无限地递归下去,也就是说,location配置块内继续嵌套location,而嵌套多少层在本节中是不受HTTP框架限制的。不过在图4-4没有表达出无限地递归处理嵌套location块的意思,仅以location中再嵌套一个location作为例子简单说明一下。

4.3.3 如何合并配置项 - 图1

图 4-4 解析完所有http配置项后合并配置的流程图

图4-4包括4重循环,第1层(最外层)遍历所有的HTTP模块,第2层遍历所有的server{……}配置块,第3层是遍历某个server{}块中嵌套的所有location{……}块,第4层遍历某个location{}块中继续嵌套的所有location块(实际上,它会一直递归下去以解析可能被层层嵌套的location块,详见10.2节)。读者可以对照上述4重循环来理解合并配置项的流程图。