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