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

devtools/2025/3/1 18:37:29/

详解(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.ppmy.cn/devtools/163692.html

相关文章

005 公网访问 docker rocketmq

文章目录 创建自定义网络创建NameServer容器创建Broker容器正式开始启动 Nameserver 容器启动 Broker 容器并关联 Nameserverdocker exec -it rmqbroker vi /etc/rocketmq/broker.conf检查 namesrv 解析检查 Broker 注册状态Nameserver 日志Broker 日志检查容器日志手动指定 Br…

硬编码(三)经典变长指令一

我们在前两节的硬编码中学习了定长指令,接下来学习变长指令。学习变长指令要求我们学会查表:intel手册卷2A和2B部分 对于定长指令,我们通过opcode便可知该指令的长度,但是对于变长指令却是不可知的。变长指令长度由opcode&#x…

Android逆向:一文掌握JEB 的详细使用

文章目录 1. JEB 简介1.1 什么是 JEB?1.2 JEB具备以下主要功能:1.3 JEB 的应用场景2. 安装 JEB2.1 下载 JEB2.2 安装和激活3. JEB 的基本操作3.1 打开 APK 文件3.2 查看反编译代码3.3 搜索功能3.4 分析代码3.5 使用脚本扩展功能4. JEB 的高级功能4.1 反混淆4.2 脚本支持4.3 调…

字符函数和字符串函数1

1、字符分类函数 C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h 在这里介绍一下islower函数,其他的非常相似。 函数原型: 1 int islower(int c); islo…

利用three.js在Vue项目中展示重构的stl模型文件

一、目的 为了在前端页面展示3d打印机打印过程 二、前期准备 完整模型的stl文件和模型切割成的n个stl文件 models文件夹下的文件就是切割后的stl文件 三、代码 <template><div ref"threeContainer" class"three-container"></div><…

DeepSeek-V3:AI语言模型的高效训练与推理之路

参考&#xff1a;【论文学习】DeepSeek-V3 全文翻译 在人工智能领域&#xff0c;语言模型的发展日新月异。从早期的简单模型到如今拥有数千亿参数的巨无霸模型&#xff0c;技术的进步令人瞩目。然而&#xff0c;随着模型规模的不断扩大&#xff0c;训练成本和推理效率成为了摆在…

WordPress多语言插件GTranslate

GTranslate是一个免费的WordPress多语言插件&#xff0c;它允许您将网站内容翻译成多种语言。这个插件提供了一个简单易用的界面&#xff0c;让您可以在WordPress后台直接进行翻译操作。以下是GTranslate插件的一些主要特点&#xff1a; 免费使用&#xff1a;GTranslate插件完…

2.部署kafka:9092

官方文档&#xff1a;http://kafka.apache.org/documentation.html (虽然kafka中集成了zookeeper,但还是建议使用独立的zk集群) Kafka3台集群搭建环境&#xff1a; 操作系统: centos7 防火墙&#xff1a;全关 3台zookeeper集群内的机器&#xff0c;1台logstash 软件版本: …