ngx_init_cycle
1.申请地址池,并且在地址池中申请分配新的cycle结构
2.给cycle结构中的各项赋值
conf_prefix/prefix/conf_file/conf_param/paths/open_files/shared_memory/listening/reusable_connections_queue/conf_ctx/hostname
3.初始化core模块的配置创建函数,并将配置指针放入到配置上下文conf_ctx中
/*ngx_modules[i]->index had been set before function ngx_int_cycle
* only index 0,6,7 will be excute here
* 0---ngx_core_conf_t
* 6---ngx_openssl_conf_t
* 7---ngx_regex_conf_t*/
4.初始化conf结构
主要是以下几个数据
args/temp_pool/ctx/cycle/pool/log/module_type/cmd_type
conf.module_type = NGX_CORE_MODULE
conf.cmd_type = NGX_MAIN_CONF
关键需要注意是
conf.ctx = cycle->conf_ctx
conf.cycle = cycle
5.调用ngx_conf_param
6.调用ngx_conf_parse解析配置文件
6.1 调用ngx_conf_read_token一行一行解析读取配置文件,
返回的情况:
1) 遇到;,说明一行结束,将配置数据保存在cf->args->elts动态数组中,该数组默认大小为10,可以动态变大,类似于c++里面的vector,返回ok
2) 遇到 {, 返回NGX_CONF_BLOCK_START,进入block块中解析子项
3) 遇到 }, 返回NGX_CONF_BLOCK_START
6.2 调用ngx_conf_handler处理配置文件数据,把相应的数据应用到具体模块和业务上去。
配置数据信息从cf-args->elts中获取
1) 循环所有模块的所有命令,去寻找命令关键字
2) 若1)中找不到,直接返回,若找到获取对应的ctx配置信息保存的结构
3) 执行command的set回调函数将配置信息存入ctx配置信息中
7. 当配置文件解析完毕后,就初始化core module的Config,如果在配置文件中有配置,则不在初始化,只初始化配置文件中没有配置的项
8. listen socket的初始化,创建并bind等操作, 打开所有的监听套接口(依次进行socket,bind,listen)
9. 调用init_module对所有的模块进行初始化
10.关闭或删除残留在old_cycle中的资源
11.返回