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

相关推荐
半路_出家ren1 小时前
MySQL数据库,DDL,DML,查询,权限,主从复制
数据库·mysql·主从复制·权限·ddl·dml
运维成长记1 小时前
Mysql的数据备份和高可用
数据库·mysql
IT技术与企业应用结合的爱好者1 小时前
c#using Oracle.ManagedDataAccess.Client 批量保存数据
数据库·oracle
l1t1 小时前
利用DeepSeek改写递归CTE SQL语句为Python程序及优化
数据库·人工智能·python·sql·算法·性能优化·deepseek
江湖一码农3 小时前
[小白]spring boot接入emqx
java·数据库·spring boot
HitpointNetSuite5 小时前
连锁餐饮行业ERP如何选择:为何Oracle NetSuite成为增长新引擎
大数据·运维·数据库·oracle·netsuite
冻咸鱼6 小时前
MySQL基础知识大全
数据库·mysql·oracle
emma羊羊6 小时前
【Redis】
数据库·redis·缓存
程序猿小蒜9 小时前
基于springboot的车辆管理系统设计与实现
java·数据库·spring boot·后端·spring·oracle
数据库知识分享者小北9 小时前
如何构建企业级数据分析助手:Data Agent 开发实践
数据库·阿里云·1024程序员节·dataagent