详解(10)
初始化模块配置
if (ngx_cycle_modules(cycle) != NGX_OK) {
ngx_destroy_pool(pool);
return NULL;
}
for (i = 0; cycle->modules[i]; i++) {
if (cycle->modules[i]->type != NGX_CORE_MODULE) {
continue;
}
module = cycle->modules[i]->ctx;
if (module->create_conf) {
rv = module->create_conf(cycle);
if (rv == NULL) {
ngx_destroy_pool(pool);
return NULL;
}
cycle->conf_ctx[cycle->modules[i]->index] = rv;
}
}
1 初始化模块列表
if (ngx_cycle_modules(cycle) != NGX_OK) {
ngx_destroy_pool(pool);
return NULL;
}
调用 ngx_cycle_modules
初始化 cycle->modules
数组,该数组包含所有核心模块的指针。
Nginx 模块分为核心模块(NGX_CORE_MODULE
)、事件模块、HTTP 模块等。ngx_cycle_modules
会遍历全局模块列表(ngx_modules
),筛选出核心模块并按优先级排序。
若模块初始化失败(如内存不足),立即回滚资源。
2 遍历核心模块
for (i = 0; cycle->modules[i]; i++) {
if (cycle->modules[i]->type != NGX_CORE_MODULE) {
continue;
}
module = cycle->modules[i]->ctx;
遍历 cycle->modules
,跳过非核心模块,获取核心模块的上下文(ctx
)。
通过 type
区分模块类型,确保仅初始化核心模块的配置。
3 创建模块配置结构
if (module->create_conf) {
rv = module->create_conf(cycle);
if (rv == NULL) {
ngx_destroy_pool(pool);
return NULL;
}
cycle->conf_ctx[cycle->modules[i]->index] = rv;
}
ngx_core_module_t *module;
module
是 ngx_core_module_t
类型的指针
关于 ngx_core_module_t
调用模块的 create_conf
方法创建默认配置结构,并将其存储到 conf_ctx
数组的对应位置。
create_conf
返回模块特定的配置结构
conf_ctx
数组通过模块的 index
索引定位配置结构。
每个核心模块(如事件模块)需要独立的配置结构,conf_ctx
是全局配置的存储中心。
4 总结
代码行 | 核心意图 | 设计哲学 |
---|---|---|
ngx_cycle_modules |
模块筛选与排序 | 按类型和优先级管理模块,确保初始化顺序正确。 |
module->type 检查 |
模块分类处理 | 仅处理核心模块,避免干扰其他模块(如 HTTP 模块)。 |
create_conf 调用 |
配置结构初始化 | 模块自定义配置,支持灵活扩展。 |
conf_ctx 存储 |
配置集中管理 | 通过索引快速访问模块配置,提升效率。 |