init_master是nginx主进程初始化阶段唯一执行一次的回调函数,仅在master-worker模式、启用master进程且非reload/reopen/单进程时,在配置加载完成后、fork worker前调用,用于主进程独占资源初始化。

init_master 是 Nginx 主进程初始化阶段执行的一个回调函数,仅在以 master-worker 模式启动、且 master 进程首次创建时被调用一次,不会在 reload、reopen 或 worker 进程中触发。
触发前提:必须满足三个条件
该回调仅在以下全部条件成立时才会执行:
- Nginx 编译时启用了
--with-master-process(默认启用,但禁用时完全不走 master 流程) - 启动方式为
nginx或nginx -c /path/to/conf,即非 daemon off 的单进程调试模式 - 配置中未设置
master_process off;—— 若显式关闭 master 进程,则整个 master 初始化流程跳过,init_master不会被调用
所处生命周期位置:早于 fork worker,晚于配置加载
其执行时机位于主流程的固定环节:
- 命令行解析和环境初始化完成之后
- 配置文件成功解析并构建出完整
ngx_cycle_t结构之后 - 但在调用
ngx_start_worker_processes()fork 子进程之前
此时所有模块的 create_main_conf 和 init_main_conf 已执行完毕,全局配置已就绪,但 worker 尚未生成,因此适合做主进程独占的资源预分配(如共享内存初始化、全局信号处理注册、主进程专用监听套接字等)。
模块如何注册 init_master 回调
模块需在自己的 ngx_module_t 定义中,将函数指针赋给 init_master 字段:
static ngx_int_t my_module_init_master(ngx_log_t *log) {
// 主进程专属初始化逻辑
return NGX_OK;
}
<p>static ngx_module_t my_module = {
// ...
NULL, /<em> init_master </em>/
my_module_init_master, /<em> init_master </em>/
// ...
};
</p>注意:该字段是模块级钩子,由 Nginx 核心在 ngx_master_process_cycle() 中统一遍历所有模块依次调用,不支持返回失败中断流程(返回非 NGX_OK 仅记日志,不影响后续)。
常见误判场景:什么情况下它不会执行
-
nginx -t或nginx -s reload:前者只做配置校验,不进入 master 循环;后者由已有 master 进程向自身发信号,复用当前 cycle,不重新调用 init_master - 使用
daemon off;启动:Nginx 直接以单进程运行,等价于master_process off;,跳过 master 流程 - 模块编译未启用或 init_master 字段为 NULL:核心会跳过该模块,不报错也不调用











