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

相关推荐
聆听。。花开雨落7 小时前
mybatis的typeHandler 作用
数据库·mybatis
pxzsky7 小时前
PG17数据库安装中分分词插件:pg_jieba
数据库·postgresql·pg_jieba
她说可以呀8 小时前
Redis哨兵
数据库·redis·bootstrap
霸道流氓气质8 小时前
KMS 密钥管理服务(Key Management Service)原理与实践
linux·服务器·数据库
kirs_ur8 小时前
CXL(Compute Express Link)— 内存扩展的未来
服务器·数据库·性能优化
MonolithIoT10 小时前
实战方案|设备备件无人值守仓库:连续化产线运维备件 7×24 小时数字化管控方案
运维·网络·数据库
hkj880810 小时前
Ubuntu 切换java版本
java·linux·ubuntu
瞬间&永恒~10 小时前
【MySQL】4-6:在同一个主机上使用 systemd 运行多个 MySQL服务器
服务器·数据库·mysql
心机之蛙qee10 小时前
Redis的主从、哨兵及集群
数据库·redis·缓存