init_master负责主进程全局初始化,init_process负责各工作进程独立初始化;前者仅执行一次且不可阻塞,后者每worker执行一次并构建私有运行环境,二者调用顺序严格、职责不可互换。

模块初始化流程中,init_master 和 init_process 是两个关键回调,它们在不同阶段、不同进程上下文中被调用,职责明确且不可互换。
init_master:主进程专属的全局初始化
该回调仅在主进程(master)启动时执行一次,用于完成跨工作进程共享的资源准备。典型场景包括:
- 打开监听 socket 并设置为非阻塞、重用地址等通用选项
- 初始化共享内存段(如用于统计或限流的 shm_zone)
- 加载配置级数据结构(如解析后的 upstream 列表、TLS 证书缓存)
- 注册信号处理器或定时器(作用域为整个 master 进程)
注意:此时工作进程尚未 fork,所有操作必须是线程安全的,且不能依赖任何 worker 特有上下文(如 event loop、connection pool)。
init_process:每个工作进程独立执行的初始化
该回调在每个 worker 进程 fork 后、进入事件循环前调用,次数等于 worker 数量。主要任务是构建进程私有运行环境:
- 初始化本进程的事件循环(epoll/kqueue 实例)、定时器队列
- 创建进程独占的连接池、缓冲区池、日志句柄
- 绑定本进程的监听 socket(从 master 继承的 fd 进行 accept 复用)
- 加载进程级配置快照(如 reload 时更新的路由规则副本)
常见错误是把本该放在这里的操作误写进 init_master,比如为每个 worker 单独 malloc 一块大内存——这会导致 master 进程重复分配,或在 fork 后出现资源泄漏。
调用顺序与生命周期约束
两者严格遵循“先 init_master,后各 worker 执行 init_process”的顺序。一旦 init_process 返回失败,对应 worker 将退出,但 master 和其他 worker 不受影响。关键约束包括:
- init_master 中不能调用阻塞 I/O 或 sleep,否则阻塞整个启动流程
- init_process 中禁止 fork 新进程或执行 exec,会破坏 worker 稳定性
- 两个回调都应在返回前完成全部初始化,不可延迟到首次请求时再懒加载核心资源
理解它们的分工,是编写可伸缩、可维护模块的基础。不复杂但容易忽略。










