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

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

详解(11)


初始化配置解析上下文

    senv = environ;


    ngx_memzero(&conf, sizeof(ngx_conf_t));
    /* STUB: init array ? */
    conf.args = ngx_array_create(pool, 10, sizeof(ngx_str_t));
    if (conf.args == NULL) {
        ngx_destroy_pool(pool);
        return NULL;
    }

    conf.temp_pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);
    if (conf.temp_pool == NULL) {
        ngx_destroy_pool(pool);
        return NULL;
    }


    conf.ctx = cycle->conf_ctx;
    conf.cycle = cycle;
    conf.pool = pool;
    conf.log = log;
    conf.module_type = NGX_CORE_MODULE;
    conf.cmd_type = NGX_MAIN_CONF;

1 保存环境变量

senv = environ;

保存当前进程的环境变量指针,用于后续配置解析中恢复环境


2 初始化配置解析结构体 conf

ngx_memzero(&conf, sizeof(ngx_conf_t));

清空 ngx_conf_t 结构体,确保无残留数据。

ngx_conf_t conf;
conf 的类型 ngx_conf_t


3 创建参数数组

conf.args = ngx_array_create(pool, 10, sizeof(ngx_str_t));

为配置指令的参数预分配动态数组,初始容量 10。


4 创建临时内存池

conf.temp_pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log);

分配临时内存池,用于解析配置时的短期资源管理(如解析过程中的中间数据),避免污染主内存池。


5 配置配置解析上下文

conf.ctx = cycle->conf_ctx;
conf.cycle = cycle;
conf.pool = pool;
conf.log = log;
conf.module_type = NGX_CORE_MODULE;
conf.cmd_type = NGX_MAIN_CONF;

conf.ctx = cycle->conf_ctx;
将配置解析上下文的 ctx 指向新周期的模块配置数组 cycle->conf_ctx

cycle->conf_ctx 是一个数组,每个元素对应一个模块的配置结构(如 ngx_core_conf_t

通过 ctx 将模块配置与解析过程绑定,模块可直接读写自己的配置。


conf.cycle = cycle;
关联配置解析上下文到当前周期(cycle

cycle 包含运行时全局资源(如内存池、监听套接字、共享内存)。

上下文传递:确保配置指令处理函数能操作当前周期的资源。


conf.pool = pool;
将配置解析的内存分配绑定到临时内存池 pool

Nginx 使用内存池(ngx_pool_t)管理配置解析的内存,避免碎片化。

解析过程的所有内存分配均通过 pool 进行,便于后续释放。


conf.log = log;
设置配置解析的日志对象为当前周期的日志。


conf.module_type = NGX_CORE_MODULE;
指定当前解析的模块类型为核心模块(NGX_CORE_MODULE)。

确保解析器仅处理核心模块的指令


conf.cmd_type = NGX_MAIN_CONF;
设置当前解析的指令层级为主配置块(NGX_MAIN_CONF)。


总结

字段设计意图核心价值
conf.ctx统一存储模块配置模块化与解耦。
conf.cycle全局资源访问支持解析器操作运行时资源(如共享内存)。
conf.pool内存安全通过内存池管理解析过程的内存,避免泄漏。
conf.log日志一致性确保解析阶段的日志与运行时配置一致。
module_type指令分类仅处理核心模块指令,避免干扰其他模块。
cmd_type层级控制确保指令应用到正确的配置层级

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

相关文章:

  • 【RandLA-Net】基于自建数据训练大场景语义分割网络RandLA-Net
  • 输电线路杆塔倾斜智能监测:守护电网安全的智慧之眼
  • uploadlabs经验总结
  • Java+iTextPDF,实时生成与预览PDF文件的最佳实践!
  • Python数据可视化——Matplotlib的基本概念和使用
  • SQL AnyWhere 的备份与恢复
  • 【节日——日期问题(不完全适用我自己的模板)】
  • 嵌入式开发:傅里叶变换(5):基于STM32,实现CMSIS中的DSP库
  • 动态规划之 “完全背包“ ------P8646 [蓝桥杯 2017 省 AB] 包子凑数
  • CISC架构
  • Rust 并发编程:Futures、Tasks 和 Threads 的结合使用
  • Flutter_学习记录_本地存储数据
  • 玩转大语言模型——Ubuntu系统环境下使用llama.cpp进行CPU与GPU混合推理deepseek
  • 人工智能 大模型在物联网感知层上的应用
  • Go与PHP性能对比分析
  • Linux系列:如何调试 malloc 的底层源码
  • Excel基础(详细篇):总结易忽视的知识点,有用的细节操作
  • 【JSON与JSONP】JSON与JSONP全面解析:定义、区别与核心技术对比
  • 初识uniApp
  • 计算机网络-实验四子网划分