cycle = ngx_init_cycle(&init_cycle):
1、在內(nèi)存池中分配一個(gè)ngx_cycle_t變量,并初始化它的各個(gè)成員。
2、調(diào)用core類型的create_conf,實(shí)際只有一個(gè)ngx_core_module_create_conf函數(shù)----初始化ngx_core_conf_t結(jié)構(gòu)(存放core_module支持的指令),保存在ngx_cycle->conf_ctx數(shù)組中。可以說(shuō),此時(shí),ngx_cycle->conf_ctx數(shù)組中只有一個(gè)ngx_core_conf_t結(jié)構(gòu)。
3、初始化ngx_conf_t結(jié)構(gòu)。
4、ngx_conf_parse 解析配置文件,把結(jié)果保存在模塊對(duì)應(yīng)的ngx_conf里面。
5、調(diào)用core類型的init_conf,實(shí)際只有一個(gè)ngx_core_module_init_conf函數(shù)(初始化對(duì)應(yīng)的ngx_core_conf_t函數(shù))。為什么要init,都已經(jīng)解析配置文件了,應(yīng)該在這之前初始化呀--如果值為-1,表明沒(méi)有設(shè)置,初始化默認(rèn)值!
6、ngx_open_listening_sockets:遍歷listening數(shù)組并打開(kāi)所有偵聽(tīng)sockets(socket()->setsockopt()->bind()->listen())。
7、調(diào)用所有模塊的init_module(實(shí)際上只有ngx_event_core_module模塊定義了該callback,即只有ngx_event_module_init()被調(diào)用)。
ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename):
函數(shù)的作用就是循環(huán)不停的從配置文件中讀取指令,然后進(jìn)行指令處理,直到結(jié)束
1、先分析ngx_core_module的指令及其對(duì)應(yīng)的set函數(shù)。
{ ngx_string("daemon"),
NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
0,
offsetof(ngx_core_conf_t, daemon),
//計(jì)算daemon成員在ngx_core_conf_t結(jié)構(gòu)體里面的偏移
NULL },
ngx_conf_set_flag_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf):里面代碼很清楚,根據(jù)配置指令,設(shè)置模塊conf結(jié)構(gòu)的成員變量。
2、分析ngx_events_modules的指令及其對(duì)應(yīng)的set函數(shù)。只有一條指令:
{ ngx_string("events"),
NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
ngx_events_block,
0,
0,
NULL },
1、ngx_events_module編號(hào)為3,于是ngx_cycle->conf_ctx指向的void*數(shù)組第3號(hào)槽位指向一個(gè)void*指針,這個(gè)指針又指向一個(gè)void*數(shù)組(個(gè)數(shù)==事件類型模塊的個(gè)數(shù),Linux平臺(tái)編譯之后,只有兩個(gè)ngx_epoll_module事件模型ngx_event_core_module和ngx_epoll_module)。
2、調(diào)用event類型模塊的上下文ngx_event_module_t 的create_conf鉤子,為void*數(shù)組指定槽位創(chuàng)建相應(yīng)的conf結(jié)構(gòu)。
3、更改當(dāng)前cf環(huán)境(NGX_EVENT_MODULE,NGX_EVENT_CONF)解析events{ 塊里面的指令。里面的set函數(shù)都是根據(jù)配置文件設(shè)置ngx_event_conf_t結(jié)構(gòu)體里面的成員變量。
3、分析ngx_http_module的指令及其對(duì)應(yīng)的set函數(shù)。只有一條指令,如下:
{ ngx_string("http"),
NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
ngx_http_block,
0,
0,
NULL },
ngx_init_cycle創(chuàng)建了core module的config,那么http module相關(guān)的config在那里創(chuàng)建呢?http module相關(guān)的config是在ngx_http_block中創(chuàng)建(ngx_http_conf_ctx_t)的,在ngx_http_block中會(huì)創(chuàng)建,初始化,合并config(未完全看懂),以及整個(gè)http handler phase的初始化(還未看)等等。
新聞熱點(diǎn)
疑難解答
圖片精選