当前位置: 首页 > article >正文

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

详解(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),筛选出核心模块并按优先级排序。
若模块初始化失败(如内存不足),立即回滚资源。


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


http://www.kler.cn/a/570555.html

相关文章:

  • 【算法刷题】leetcode hot 100 动态规划
  • 探秘基带算法:从原理到5G时代的通信变革【四】Polar 编解码(一)
  • 【JavaScript/JS】事件回调函数this指向不到Vue/Class 实例上下文的变量或者方法的问题
  • 网络安防系统安装与维护专业(710208)物联网基础技术实训室建设方案
  • 蓝桥杯试题:特殊的三角形
  • 基础设施安全(Infrastructure Security)是什么?
  • Golang学习笔记_41——观察者模式
  • Skynet入门(一)
  • 开源ocr
  • 19c startup ORA-00093 ORA-01078 pga_aggregate_limit
  • 千峰React:组件与逻辑封装(下)
  • Leetcode 刷题记录 01 —— 哈希
  • 医院信息科医疗语言大模型开发的风险洞察与避坑策略
  • 6.C#对接微信Native支付(退款申请、退款回调通知)
  • Kafka Connect连接器的全生命周期:
  • Pytest测试用例执行跳过的3种方式
  • 安路FPGA开发入门:软件安装与点灯与仿真(TangDynasty ModelSim)
  • 单体架构部署的缺陷:为什么现代应用需要转型?
  • yolov8训练模型、测试视频
  • 深入解析Java虚拟机(JVM)的核心组成