Nginx配置通过Master进程解析生成ngx_cycle_t结构体,Worker进程通过fork继承该内存快照,重载时用新cycle替换旧cycle实现热更新,并借助共享内存(shm)同步跨进程状态。

Nginx 的配置参数本身不通过进程间通信“动态传递”,而是由 Master 进程在启动或重载时,将解析并验证后的完整配置结构体(ngx_cycle_t)直接复制或共享给新启动的 Worker 进程——不是靠发送字符串或键值对,而是靠内存布局继承与显式共享机制。
Master 启动时固化配置到内存
Master 进程启动时读取 nginx.conf,完成词法/语法解析、变量展开、上下文合并(如 http/server/location 嵌套),最终生成一个完整的运行时配置结构 ngx_cycle_t。这个结构体包含所有模块的配置项(如 worker_connections、keepalive_timeout)、监听地址、共享内存段定义等。它驻留在 Master 的内存中,是后续所有操作的唯一权威来源。
Worker 进程通过 fork 继承配置内存快照
当 Master 调用 fork() 启动 Worker 时,子进程自动继承父进程的整个虚拟内存空间(写时复制)。这意味着每个 Worker 在启动瞬间就拥有一份和 Master 当前完全一致的 ngx_cycle_t 副本——包括所有已解析的数值、指针、标志位。不需要额外传输,也不依赖环境变量或配置文件重读。
- 例如:
worker_processes 4;→ Master 计算出需启 4 个 Worker;每个 Worker 的cycle->connection_n直接等于worker_connections解析值 - 再如:
ssl_certificate /etc/ssl/nginx.crt;→ Master 已打开该文件并缓存文件描述符,Worker 继承 fd 并复用
重载配置时用“新 cycle 替换旧 cycle”
执行 nginx -s reload 时,Master 不修改自身正在运行的 ngx_cycle_t,而是:
- 重新解析配置,构建全新的
ngx_cycle_t(含更新后的参数) - 向旧 Worker 发送
QUIT信号,令其优雅退出 - 用新
cycle为每个新 Worker 调用fork()→ 新 Worker 继承的是更新后的配置内存
旧 Worker 仍在用老配置处理剩余请求,新 Worker 从第一秒起就按新参数工作。零配置热切换由此实现。
共享内存(shm)是跨进程同步配置状态的关键载体
某些配置效果需多个 Worker 协同体现(如限流计数器、缓存锁、SSL 会话复用),这时 Master 会在初始化阶段调用 ngx_shm_alloc() 创建共享内存区,并把关键结构(如 ngx_slab_pool_t)放进去。所有 Worker 通过相同地址映射访问同一块物理内存:
-
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;→ Master 分配 shm 区,Worker 共同读写哈希表 -
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m;→mycachezone 也是 shm,Worker 通过它协调缓存索引
这不是“传递参数”,而是让所有 Worker 基于同一份实时数据做出一致决策。


















