ngx_module_t是Nginx模块的核心结构体,包含context(上下文指针)、commands(配置指令数组)、init_*(生命周期钩子)和元信息(type/name等)四部分,共同决定模块类型、配置解析、初始化时机与身份标识。

要开发 Nginx 模块,必须理解 ngx_module_t 这个核心结构体——它是模块的“身份证”和“行为说明书”,Nginx 启动时靠它识别模块类型、注册钩子、初始化资源。
module context:模块上下文指针,决定模块归属与行为模式
该成员是一个 void 指针,实际指向某类模块特有的上下文结构,比如 ngx_http_module_t(HTTP 模块)、ngx_core_module_t(核心模块)、ngx_event_module_t(事件模块)等。Nginx 通过它区分模块职责,并在对应阶段调用其回调函数。
- HTTP 模块必须设为
&ngx_http_core_module或自定义的ngx_http_module_t实例 - 核心模块(如 ngx_core_module)用
ngx_core_module_t,负责配置解析、进程管理等全局逻辑 - 值为 NULL 表示该模块无上下文逻辑(如某些纯指令模块),但不推荐省略
commands:模块支持的配置指令数组,驱动配置解析流程
这是一个 ngx_command_t 类型的静态数组,以 { 0 } 结尾。每条指令定义名称、类型、参数个数、配置作用域、读取/设置回调等关键信息。
-
name是配置文件中出现的指令名(如my_directive) -
type标明指令生效位置(NGX_HTTP_MAIN_CONF 表示仅在 http 块可用) -
set回调是真正处理配置值的地方,接收cf(配置上下文)、cmd(当前指令)、conf(模块配置内存地址)三个参数 - 若无自定义指令,可设为 NULL,但多数功能模块都需要至少一条
init_master / init_module / init_process:生命周期三阶段钩子
这三个函数指针分别在 master 进程启动、模块加载、worker 进程初始化时被调用,用于执行不同粒度的初始化操作。
-
init_master:仅 master 进程执行一次,适合做全局资源预分配(如共享内存初始化) -
init_module:所有进程加载模块时调用,常用于注册信号、初始化静态变量 -
init_process:每个 worker 进程启动时调用,最常用——建立连接池、初始化线程局部存储、打开 epoll 等 - 不需要某个阶段时,直接设为 NULL 即可,Nginx 会跳过
type / ctx_index / index / name:模块元信息,影响调度与兼容性
这些字段共同构成模块的“身份标识”,由 Nginx 内部使用,开发者需按规范填写。
-
type必须设为NGX_HTTP_MODULE、NGX_CORE_MODULE等宏之一,决定模块挂载位置 -
ctx_index和index是整型索引,用于快速定位模块及其上下文;HTTP 模块通常由 Nginx 自动分配,手动开发建议设为 NGX_CONF_UNSET_UINT -
name是字符串指针(如ngx_string("ngx_http_myfilter_module")),用于日志、调试和错误提示
掌握这四个维度的成员,就能写出结构正确、可被 Nginx 正常加载和调用的基础模块。后续指令解析、配置合并、HTTP 处理阶段挂载,都建立在这个结构体扎实定义之上。

















