前篇—数据结构在内存中的映像。
http块内的配置解析,内存配置结构。“加载-发现-解析”。
所有模块配置解析都是由ngx_conf_parse()发起的,先调用ngx_read_token()读取一个配置项,然后调用ngx_conf_handler()来解析配置项。在http模块中,如遇到http指令,调用ngx_http_block()来解析整个http模块的配置。调用ngx_conf_parse()解析指令,配置环境根据ngx_http_block()函数调用的回调函数的结果进行转换。
在http{}对应的ngx_http_core_module的main配置ngx_http_core_main_conf_t中有一个servers存储了http()块下的所有的server结构,主要便于后续merge。
图片来自:http://blog.youkuaiyun.com/kai_ding/article/details/40294585
1、http模块的每个层级配置都有一个ngx_http_conf_ctx_t;
2、http块下的server块的ngx_http_conf_ctx_t结构存储在http块对应的ngx_http_conf_ctx_t的main_conf的ngx_http_core模块的ngx_http_core_main_conf_t的servers字段中;
3、每个server的ngx_http_conf_ctx_t内创建srv_conf和loc_conf数组,以解析server{}内的配置,但不需要main_conf数组,main_conf直接指向父配置块的main_conf。
nginx配置指令的创建类似迭代创建ngx_http_conf_ctx_t结构。
1、每个模块的指令按照其作用域不同采用不同的数据结构;作用域为main的指令组织成数据结构ngx_http_..._main_conf_t,作用域为main|srv的指令被组织成数据结构ngx_http_..._srv_conf_ctx_t,作用域为main|srv|conf的指令被组织成数据结构ngx_http_..._conf_ctx_t;
2、对于每个块内的指令解析,如果该指令属于ngx_http_..._main_conf_t,将创建的该结构体存储在ngx_http_conf_ctx_t的main_conf[index]中;如果该指令属于ngx_http_..._srv_conf_ctx_t,那么将创建的该结构体存储在代表该配置块的ngx_http_conf_ctx_t的srv_conf[index]中。