当Nginx检测到配置文件中存在配置块http{}时,会建立一个ngx_http_conf_ctx_t结构体,该结构体定义如下:
typedef struct {
void **main_conf; // 每个指针元素指向所有由HTTP模块的create_main_conf方法产生的结构体
void **srv_conf; // 每个指针元素指向所有由HTTP模块的create_srv_conf方法产生的结构体
void **loc_conf; // 每个指针元素指向所有由HTTP模块的create_loc_conf方法产生的结构体
} ngx_http_conf_ctx_t;ngx_http_conf_ctx_t *ctx; // 定义一个该结构体的指针
ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t)); // 分配该结构体空间
ctx->main_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module); // 分配数组存放指针
ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module); // 分配数组存放指针
ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module); // 分配数组存放指针
for (m = 0; ngx_modules[m]; m++)
{
if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
continue;
}
module = ngx_modules[m]->ctx;
mi = ngx_modules[m]->ctx_index;
if (module->create_main_conf)
{
/* 依次调用所有HTTP模块的create_main_conf方法
* 产生的结构体指针放入上面分配了空间的main_conf指针数组中
*/
ctx->main_conf[mi] = module->create_main_conf(cf);
if (ctx->main_conf[mi] == NULL)
{
return NGX_CONF_ERROR;
}
}
if (module->create_srv_conf)
{
/* 依次调用所有HTTP模块的create_srv_conf方法
* 产生的结构体指针放入上面分配了空间的srv_conf指针数组中
*/
ctx->srv_conf[mi] = module->create_srv_conf(cf);
if (ctx->srv_conf[mi] == NULL)
{
return NGX_CONF_ERROR;
}
}
if (module->create_loc_conf)
{
/* 依次调用所有HTTP模块的create_loc_conf方法
* 产生的结构体指针放入上面分配了空间的loc_conf指针数组中
*/
ctx->loc_conf[mi] = module->create_loc_conf(cf);
if (ctx->loc_conf[mi] == NULL)
{
return NGX_CONF_ERROR;
}
}
}

【Nginx】HTTP配置模型,布布扣,bubuko.com
原文:http://blog.csdn.net/nestler/article/details/34128109