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

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层级控制确保指令应用到正确的配置层级

相关文章:

  • Let‘s Encrypt免费证书的应用示例
  • 2025年2月28日(RAG)
  • 为AI聊天工具添加一个知识系统 之127 详细设计之68 应用行规:符号学芭比 之2
  • 西门子S7-1200 PLC计数器详解
  • docker-compose部署开源堡垒机Orion-Visor——筑梦之路
  • 随笔 | 写在二月的最后一天
  • 常用的 pip 命令
  • springboot rocketmq配置生产者和消息者
  • 优化器Reaction1:从动力学角度看优化算法(1.1):从GD 到 SGD
  • 提示词框架介绍和使用场景
  • VBA技术资料MF276:在集合中使用键
  • 利用 Python 爬虫进行跨境电商数据采集
  • 小程序画带圆角的圆形进度条
  • ctfshow——敏感信息公布
  • Linux入门
  • Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(十一)
  • IDEA提示将方法形参更改为(什么什么类型),要检查对应的实体类中的字段类型是否正确
  • 如何配置虚拟机的IP上网
  • QT day1
  • 【Redis】Redis初阶
  • 菏泽网站建设网站/鞍山做网站的公司
  • 建设网站管理规定/南宁网站推广公司
  • 帝国cms个人网站模板/线上宣传推广方式
  • 手机版网站建设价格/百度指数搜索榜
  • 腾讯云怎么建设网站/廊坊关键词快速排名
  • 做产品网站淘宝百度/网站seo推广招聘