当Nginx检测到http关键配置项时,http配置模型启动,首先会建立一个ngx_http_cong_ctx_t结构。
typedef struct
{
void **main_conf;
void **srv_conf;
void **loc_conf;
}ngx_http_conf_ctx_t;
http框架会为所有的http模块建立三个数组,分别存放所有http模块create_main_conf,create_srv_conf,create_loc_conf方法返回的地址指针。
一、解析http配置的流程
1.Nginx进程的主循环调用配置文件解析器来解析nginx.conf文件
2.当发现配置文件中含有http{}关键字时,http框架开始启动。
3.http框架会初始化所有http模块的序列号,并创建ngx_http_conf_ctx_t结构
4.调用每个http模块的create_main_conf,create_srv_conf,create_loc_conf方法
5.把各http模块上述三个方法返回的地址依次保存到ngx_http_conf_ctx_t结构体的单个数组中
...
二、http配置模型的内存布局
如果实现了create_main_conf方法,它所创建的结构体只会存放直接出现在http{}块下的配置项;如果实现了create_srv_conf方法,那么它所创建的结构体既会存放直接出现在http{}块下的配置项,也会存放直接出现在server{}块下的配置项,create_loc_conf方法同理。
以上设计是考虑到nginx.conf文件中高级别的配置可以对所包含的低级别配置起作用,同时也给出了不同级别下同名配置冲突时的解决方案。
三、如何合并配置项
对各模块及其嵌套模块的结构体调用merge_srv_conf,merge_loc_conf操作