查看某一个server下面的loc_conf
p (ngx_http_hls_stat_loc_conf_t)((ngx_http_core_srv_conf_t **)0xf29ee0)[0]->ctx->loc_conf[ngx_http_hls_stat_module.ctx_index]
查看某一个rtmp server下面的main conf
cmcf = ((ngx_rtmp_conf_ctx_t)cycle->conf_ctx[ngx_rtmp_module])->main_conf[ngx_rtmp_core_module.ctx_index];
nginx配置读取从这个函数开始:
ngx_cycle_t *
ngx_init_cycle(ngx_cycle_t *old_cycle) //初始化一些参数
{
...
if (ngx_conf_param(&conf) != NGX_CONF_OK) {//重启带着old_cycle时获取配置文件地址
environ = senv;
ngx_destroy_cycle_pools(&conf);
return NULL;
}
//ngx_conf_parse 函数会递归的根据配置文件的信息,设置各级别的conf
if (ngx_conf_parse(&conf, &cycle->conf_file) != NGX_CONF_OK) {
environ = senv;
ngx_destroy_cycle_pools(&conf);
return NULL;
}
...
}
这里只讨论系统启动不带old_cycle的流程:
每次都是这样的过程,依据cmd->type 来获取需要填充的ctx指针地址
再调用cmd->set() 设置参数,当遇到block模块又调用ngx_conf_parse解析接下来的参数
//遇到http的block
pcf = *cf;//保存上一级配置,用于递归使用ngx_conf_parse
cf->ctx = ctx;
cf->module_type = NGX_HTTP_MODULE;//设置当前正在解析的的模块
cf->cmd_type = NGX_HTTP_MAIN_CONF;//设置cmd_type
rv = ngx_conf_parse(cf, NULL);
....
*cf = pcf;
下面是解析events 和http的模块的流程
关于四级指针init_cycle->conf_ctx 的意义也可以从流程中读取
参考:
Nginx:管理HTTP模块的配置项
cycle结构体的四级指针详解 里面的图画的也很清晰
http block{} 和 server block{}
location block{}的详解:
每个location都有保存一个ngx_http_conf_ctx_t
ngx_http_core_loc_conf_s //location{}
ngx_http_core_srv_conf_t //server{}
ngx_http_core_main_conf_t //http{}
//这三个结构体解析保存每个block的信息
/*
http A{
... //这里的信息都设置在http级别的ngx_http_conf_ctx_t中各个模块里
server S{
... //这里的信息都设置在Server级别的ngx_http_conf_ctx_t中各个模块里
location /{
... //这里的信息都设置在Location级别的ngx_http_conf_ctx_t中各个模块里
}
}
}
*/
为什么一定要ngx_http_conf_ctx_t?
1.location的可以向上访问server级别的配置,也可以向上访问main级别的配置
2.根据传入cf->cmd_type = NGX_HTTP_LOC_CONF 不同的类型 到 ngx_conf_parse(...)一个函数 就可以设置所有级别(DIRECT/NGX_MAIN/HTTP_MAIN/HTTP_SEV/HTTP_LOC)的配置 代码复用性高
合并不同级别的配置项
HTTP框架提供了merge_srv_conf方法用于合并main级别和srv级别的server相关的配置项,
同时,它还提供了merge_loc_conf方法用于合并main级别、srv级别、loc级别的location相关的配置项。
合并不同级别的配置项的步骤如下:
1.遍历所有HTTP模块,如果该模块实现了merge_srv_conf方法,则调用该方法来合并main级别和srv级别的server相关的结构体;
2.遍历所有HTTP模块,如果该模块实现了merge_loc_conf方法,先将main级别和srv级别的location相关的结构体合并,
然后将srv级别和loc级别的location相关的结构体合并。