nginx 读取配置到conf_ctx流程

查看某一个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相关的结构体合并。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值