ngx_cycle_t通过conf_ctx指针数组为各核心模块分配独立配置上下文,每个元素指向对应模块的xxx_conf_t结构;模块通过create_conf函数初始化上下文,其生命周期由cycle控制,非核心模块上下文则嵌套在http_conf_t中分层管理。

在 Nginx 源码中,ngx_cycle_t 并不直接“承载”所有核心模块的上下文数据,而是通过统一的指针数组 conf_ctx 为每个核心模块分配独立的配置上下文空间,由各模块在初始化阶段自行构造和管理。
conf_ctx 是核心模块上下文的容器
ngx_cycle_t 结构体中有一个关键字段:
void **conf_ctx;
这是一个 void* 类型的指针数组,长度等于 Nginx 编译时注册的核心模块数量(即 ngx_core_module_n)。每个下标对应一个核心模块(如 ngx_events_module、ngx_http_module、ngx_mail_module 等),该位置存储的是该模块专属的配置上下文结构体指针(通常是 xxx_conf_t 类型)。
例如:
-
conf_ctx[0]→ 指向ngx_event_conf_t *(事件模块配置) -
conf_ctx[1]→ 指向ngx_http_conf_t *(HTTP 模块配置) -
conf_ctx[2]→ 指向ngx_mail_conf_t *(Mail 模块配置)
模块通过 create_conf 构造自己的上下文
每个核心模块必须实现 create_conf 回调函数,在 Nginx 启动配置解析前被调用。它负责为本模块分配并初始化一块内存,作为该模块的配置上下文:
- 该函数返回一个
void *,实际是模块私有配置结构体(如ngx_http_conf_t)的指针 - Nginx 将这个指针存入
conf_ctx[module->index] - 后续配置指令解析(
sethandler)和模块初始化(init_module)均可通过cycle->conf_ctx[module->index]安全访问本模块上下文
cycle 生命周期决定上下文生命周期
ngx_cycle_t 是 Nginx 运行时的“主周期”对象,代表一次完整配置加载与工作进程启动过程。它的创建与销毁严格控制着所有核心模块上下文的生存期:
- 启动时:分配
conf_ctx数组 → 遍历核心模块调用create_conf→ 填充各模块上下文指针 - 重载时(SIGHUP):旧
cycle仍被 worker 使用;新cycle重建conf_ctx及全部模块上下文;切换完成后旧 cycle 被释放 - 因此,模块不能持有跨 cycle 的裸指针;上下文应只依赖当前
cycle实例
注意:conf_ctx 不包含非核心模块上下文
conf_ctx 仅服务于核心模块(NGX_CORE_MODULE)。HTTP 模块下的子模块(如 ngx_http_core_module 或第三方模块)的配置上下文并不放在这里:
- 它们的配置结构体嵌套在
ngx_http_conf_t内部(通过loc_conf/srv_conf/main_conf三级指针数组组织) - HTTP 框架在解析时,会为每个 HTTP 子模块在
http_conf_t中预留槽位,并调用其create_loc_conf等函数 - 所以真正的“所有模块上下文”是分层组织的:
cycle → conf_ctx → http_conf_t → main/srv/loc_conf[]

















