Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(10)

详解(10)


初始化模块配置

c 复制代码
   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 初始化模块列表

c 复制代码
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),筛选出核心模块并按优先级排序。

若模块初始化失败(如内存不足),立即回滚资源。


ngx_cycle_modules


2 遍历核心模块

c 复制代码
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 创建模块配置结构

c 复制代码
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;
modulengx_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 存储 配置集中管理 通过索引快速访问模块配置,提升效率。

相关推荐
野生绿箭侠17 分钟前
Ncos 2.3.2 版本集成达梦数据库
数据库
仍然.1 小时前
MYSQL--约束
数据库·mysql
乡野码圣1 小时前
【RK3588 Android12】RCU机制
java·jvm·数据库
亓才孓1 小时前
[数据库]应该注意的细节
数据库·sql
m0_561359673 小时前
掌握Python魔法方法(Magic Methods)
jvm·数据库·python
xxxmine3 小时前
redis学习
数据库·redis·学习
qq_5470261793 小时前
Redis 常见问题
数据库·redis·mybatis
APIshop3 小时前
Java 实战:调用 item_search_tmall 按关键词搜索天猫商品
java·开发语言·数据库
小陈phd3 小时前
混合知识库搭建:本地Docker部署Neo4j图数据库与Milvus向量库
数据库·docker·neo4j
2401_838472513 小时前
使用Python进行图像识别:CNN卷积神经网络实战
jvm·数据库·python