来源: 最后更新:24-06-02 12:11:10
cycle = ngx_init_cycle(&init_cycle):
1、在内存池中分配一个ngx_cycle_t变量,并初始化它的各个成员。
2、调用core类型的create_conf,实际只有一个ngx_core_module_create_conf函数----初始化ngx_core_conf_t结构(存放core_module支持的指令),保存在ngx_cycle->conf_ctx数组中。可以说,此时,ngx_cycle->conf_ctx数组中只有一个ngx_core_conf_t结构。
3、初始化ngx_conf_t结构。
4、ngx_conf_parse 解析配置文件,把结果保存在模块对应的ngx_conf里面。
5、调用core类型的init_conf,实际只有一个ngx_core_module_init_conf函数(初始化对应的ngx_core_conf_t函数)。为什么要init,都已经解析配置文件了,应该在这之前初始化呀--如果值为-1,表明没有设置,初始化默认值!
6、ngx_open_listening_sockets:遍历listening数组并打开所有侦听sockets(socket()->setsockopt()->bind()->listen())。
7、调用所有模块的init_module(实际上只有ngx_event_core_module模块定义了该callback,即只有ngx_event_module_init()被调用)。
ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename):
函数的作用就是循环不停的从配置文件中读取指令,然后进行指令处理,直到结束
1、先分析ngx_core_module的指令及其对应的set函数。
{ ngx_string("daemon"),
NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
0,
offsetof(ngx_core_conf_t, daemon),
//计算daemon成员在ngx_core_conf_t结构体里面的偏移
NULL },
ngx_conf_set_flag_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf):里面代码很清楚,根据配置指令,设置模块conf结构的成员变量。
2、分析ngx_events_modules的指令及其对应的set函数。只有一条指令:
{ ngx_string("events"),
NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
ngx_events_block,
0,
0,
NULL },
1、ngx_events_module编号为3,于是ngx_cycle->conf_ctx指向的void*数组第3号槽位指向一个void*指针,这个指针又指向一个void*数组(个数==事件类型模块的个数,Linux平台编译之后,只有两个ngx_epoll_module事件模型ngx_event_core_module和ngx_epoll_module)。
2、调用event类型模块的上下文ngx_event_module_t 的create_conf钩子,为void*数组指定槽位创建相应的conf结构。
3、更改当前cf环境(NGX_EVENT_MODULE,NGX_EVENT_CONF)解析events{ 块里面的指令。里面的set函数都是根据配置文件设置ngx_event_conf_t结构体里面的成员变量。
3、分析ngx_http_module的指令及其对应的set函数。只有一条指令,如下:
{ ngx_string("http"),
NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
ngx_http_block,
0,
0,
NULL },
ngx_init_cycle创建了core module的config,那么http module相关的config在那里创建呢?http module相关的config是在ngx_http_block中创建(ngx_http_conf_ctx_t)的,在ngx_http_block中会创建,初始化,合并config(未完全看懂),以及整个http handler phase的初始化(还未看)等等。
1、为ngx_cycle->conf_ctx指向的void*数组创建ngx_http_conf_ctx_t结构,并为ngx_http_conf_ctx_t 创建main_conf srv_conf loc_conf三个void*数组,数组大小为http类型模块的个数。
//http 里面的main指令,ctx指向于ngx_http_conf_ctx_t
//一些读取配置时候的零碎变量,一般为null
};
4.2 遇到 server指令时:
生成一个新的ngx_http_conf_ctx_t,其中main_conf指向原来的,server_conf和loc_conf创建新的void*数组。把ngx_http_core_module的server块配置信息存入 main_conf 中的server 容器里面。更新当前环境。 开始解析server块里面的指令。
cf->ctx = ctx; //指向新的ngx_http_conf_ctx_t
cf->cmd_type = NGX_HTTP_SRV_CONF;
4.3 遇到server里面的指令:遇到listen 指令时,ngx_conf_handler中,confp指向的新的ngx_http_conf_ctx_t.srv_conf所指向的void*数组,于是 conf = confp[ngx_modules[i]->ctx_index];指向listen指令对应的模块(ngx_htt_core_module)的 ngx_http_core_srv_conf_t数据结构。
4.4 遇到location指令:生成一个新的ngx_http_conf_ctx_t,其中main_conf指向原来的,srv_conf指向上一层ngx_http_conf_ctx_t的srv_conf数组,loc_conf创建新的void*数组。
ngx_http_core_location 这个函数很麻烦,看起来主要是设置ngx_http_loc_conf_ctx_t里面的name变量。然后递归调用ngx_parse_conf解析location里面的命令。
4.5: 遇到location里面的命令。比如 root,设置ngx_http_loc_conf_ctx_t里面的root变量。
5、回到ngx_http_block函数!遍历每个http类型的模块,调用模块上下文ngx_http_module_t中的init_main_conf钩子初始化模块对应的main_conf配置信息,然后调用ngx_http_merge_servers。
李京霖悦然医美:选择什么吸脂方式更好 虽说吸脂术可以减少局部的皮下脂肪,但并不是什么部位都可以吸脂
怎么解决留守儿童问题如何解决留守儿童问题 实探安徽铜陵坍塌居民楼:建成二十余年历经三次改造,仍未阻止悲剧发生 2024济宁太白湖新区飞机防治时间+区域 济宁太白湖新区最新新闻 2024第36届潍坊金宝汽车文化博览会时间