1. 程式人生 > >Nginx源碼分析之中原六仔源碼修復

Nginx源碼分析之中原六仔源碼修復

都是 通過 set work 二級 -- direct print 就是

Nginx的配置結構復雜至極,比Nginx其他模塊的都復雜,想要徹底搞清楚,還需要下功夫。下面是個人的一些理解。中原六仔源碼修復(企 娥:217 1793 408)

if (cmd->type & NGX_DIRECT_CONF) {
/"daemon" "worker_processes"等指令為NGX_DIRECT_CONF指令
其實也是NGX_MAIN_CONF指令,但是先判斷了NGX_DIRECT_CONF所以走這個分支
*/
conf = ((void **) cf->ctx)[ngx_modules[i]->index];

} else if (cmd->type & NGX_MAIN_CONF) {

/例如"http" "mail" "events" 等指令為 NGX_MAIN_CONF 指令/
conf = &(((void **) cf->ctx)[ngx_modules[i]->index]);

} else if (cf->ctx) {
/這些指令都是隸屬於上層指令之下的指令,比如HTTP的server指令等/
confp = *(void *) ((char ) cf->ctx + cmd->conf);

if (confp) {
    conf = confp[ngx_modules[i]->ctx_index];
    printf("-- else conf:%p\n", conf);
}

}

NGX_DIRECT_CONF和NGX_MAIN_CONF表示是配置文件的最外層指令,不同點在於DIRECT和NGX_MAIN_CONF配置的內存操作有差異。

cf->ctx都是在 函數 ngx_init_cycle中通過cycle->conf_ctx = ngx_pcalloc(pool, ngx_max_module sizeof(void ))獲取得到的內存。
所以 DIRECT類型 指令 獲取的 conf 是 cycle->conf_ctx[index],而 MAIN 類型指令獲取的 conf 是&cycle->conf_ctx[index]。

對於DIRECT指令,獲取到的conf是自己create_conf返回的內存。 例如 ngx_core_module_create_conf、ngx_regex_create_conf等core module的create_conf註冊函數,所以 cmd->set 中直接使用這個conf就行了。

對於MAIN指令,conf取得是 cycle->conf_ctx[index] 的地址而不是裏面的值,其實純MAIN指令,沒有create_conf指令,cf->ctx[index]取出來也是NULL,所以取conf = &cf->ctx[index]的目的,就是取二級指針,然後在cmd->set函數中,執行類似*conf = malloc(..)的操作,相當於對cf->ctx[index]進行賦值。

話句話說,MAIN指令,其ctx不可能由create_conf簡單的創建出來或者壓根不需要在create_conf階段創建內存,所以需要在cmd->set中自行處理。

Nginx源碼分析之中原六仔源碼修復