Nginx配置文件处理过程(3)

这个文件定义了ngx_http_module模块,是属于NGX_CORE_MODULE类型的,包含“http"指令,这个指令的type是NGX_MAIN_CONF | NGX_CONF_BLOCK,对应的set是ngx_http_block。接下来,看看ngx_http_block做些什么。

1.计算NGX_HTTP_MODULE模块的索引值,以及ngx_http_max_module。

ngx_http_max_module = 0;

for (m = 0; ngx_modules[m]; m++) {
        if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
            continue;
        }

ngx_modules[m]->ctx_index = ngx_http_max_module++;
    }

2.创建三个数组main_conf, srv_conf, loc_conf用于存放所有HTTP模块将产生的配置结构体指针。调用每个模块的create_main_conf, create_srv_conf, create_loc_conf,并将返回的配置结构体指针放在对应的数组当中。

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) {
            ctx->main_conf[mi] = module->create_main_conf(cf);
            if (ctx->main_conf[mi] == NULL) {
                return NGX_CONF_ERROR;
            }
        }

if (module->create_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) {
            ctx->loc_conf[mi] = module->create_loc_conf(cf);
            if (ctx->loc_conf[mi] == NULL) {
                return NGX_CONF_ERROR;
            }
        }
    }

3. 调用每个模块的preconfiguration函数进行预处理。

for (m = 0; ngx_modules[m]; m++) {
        if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
            continue;
        }

module = ngx_modules[m]->ctx;

if (module->preconfiguration) {
            if (module->preconfiguration(cf) != NGX_OK) {
                return NGX_CONF_ERROR;
            }
        }
    }

4. 进入http配置指令的内部指令解析过程,包括server配置指令结构,location配置指令结构等。

pcf = *cf;  /* pcf保存原配置信息 */ 
sp;  cf->ctx = ctx; 

cf->module_type = NGX_HTTP_MODULE; 
    cf->cmd_type = NGX_HTTP_MAIN_CONF;  /* 改变配置文件解析位置信息 */
    rv = ngx_conf_parse(cf, NULL);

*cf = pcf; /* 最后在返回前,恢复 */ 

5. init http{} main_conf's, merge the server{}s' srv_conf's and its location{}s' loc_conf's 和create location trees。这部分还没看懂。

6.init_phases

7.调用HTTP模块的postconfiguration函数,做后期处理。例如,默认值处理可以放在这里执行。

for (m = 0; ngx_modules[m]; m++) {
        if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
            continue;
        }

module = ngx_modules[m]->ctx;

if (module->postconfiguration) {
            if (module->postconfiguration(cf) != NGX_OK) {
                return NGX_CONF_ERROR;
            }
        }
    }

8. ngx_http_variables_init_vars

9.ngx_http_init_phase_handlers

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/64ba5f4b6d3dcb68cb388584cb45b78a.html