当前位置: 首页 > 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层级控制确保指令应用到正确的配置层级
http://www.lryc.cn/news/544710.html

相关文章:

  • 千峰React:案例一
  • 部署Joplin私有云服务器postgres版-docker compose
  • rust学习笔记6-数组练习704. 二分查找
  • Jsmoke-一款强大的js检测工具,浏览器部署即用,使用方便且高效
  • PyCharm中通过命令行执行`pip`命令下载到哪里了:虚拟环境目录下
  • Spring Boot操作MaxComputer(保姆级教程)
  • Spring的构造注入
  • 服务器IPMI用户名、密码批量检查
  • 管理后台环境配置
  • element-ui infiniteScroll 组件源码分享
  • Pany-v2:LFI漏洞探测与敏感文件(私钥窃取/其他)自动探测工具
  • 供应链管理系统--升鲜宝门店收银系统功能解析,登录、主界面、会员 UI 设计图(一)
  • Day11,Hot100(贪心算法)
  • nss刷题4
  • Eclipse 编译项目指南
  • 天佐.乾坤袋 基于抽屉式文件存储的NoSql数据库
  • win11编译pytorch cuda128版本流程
  • Windows 11 下正确安装 Docker Desktop 到 D 盘的完整教程
  • IDEA - 查看类的继承结构(通过快捷键查看、通过生成类图查看)
  • Vue 3指令全解析:内置指令与自定义指令实战指南
  • Springboot 自动化装配的原理
  • Linux——进程池
  • Qt基于等待条件QWaitCondition实现的任务队列模型示例
  • 微服务即时通信系统---(六)语音识别子服务
  • JavaWeb基础专项复习5——请求对象和响应对象request and response
  • mac下载MAMP6.8.1;解决mac使用小皮面板安装php7.4
  • 大模型WebUI:Gradio全解12——LangChain原理、架构和组件(3)
  • redis --- 相关基础知识整理
  • 如何用 Python 进行机器学习
  • 《Effective Objective-C》阅读笔记(下)