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中自行处理。
原文地址:http://blog.51cto.com/13862029/2139807