Nginx Master进程不监听端口也不处理连接,仅协调Worker完成所有listen指令的初始化:统一解析配置、预检端口/IP/证书等约束,提前创建并继承监听套接字,reload时平滑过渡,连接分发由内核(reuseport或accept_mutex)决定。

Nginx 的 Master 进程本身不监听端口,也不处理连接,它只负责协调多个 Worker 进程完成所有监听端口的初始化与生命周期管理。
Master 统一解析并预检所有 listen 指令
启动时,Master 读取 nginx.conf,遍历 http 和 stream 块中全部 listen 配置(如 listen 80、listen [::]:443 ssl、listen 192.168.1.10:8000),生成完整监听地址列表。它会提前验证:
- 端口是否被占用(尤其 1–1023 端口需 root 权限)
- 绑定 IP 是否存在于本机(如 listen 10.99.99.1:80 会失败)
- SO_REUSEPORT 是否可用(取决于内核版本和配置)
- SSL 相关证书路径是否存在、可读
任一检查失败,Master 直接报错退出,避免 Worker 启动后分散失败。
监听套接字由 Master 创建并继承给 Worker
在 fork Worker 前,Master 已调用 socket()/bind()/listen() 为每个 listen 指令创建好监听套接字,并设置 SO_REUSEADDR(默认)或 SO_REUSEPORT(显式配置时)。这些套接字通过文件描述符继承,自动传递给每个 Worker 进程。
- Worker 不重复创建套接字,而是直接复用 Master 已准备好的 fd
- 所有 Worker 都监听完全相同的端口组合(除非配置了不同 server 块绑定不同 IP)
- reload 时,Master 为新增 listen 创建新套接字,旧 Worker 逐步关闭老套接字,实现无缝过渡
连接分发不由 Master 控制,依赖内核机制
Master 从不参与 accept 或连接路由。新连接如何落到哪个 Worker,取决于系统级机制:
- 未启用 reuseport:所有 Worker 共享同一个监听套接字,靠 accept_mutex 串行争抢 accept()
- 启用 listen ... reuseport:内核为每个 Worker 创建独立监听 socket,自动负载均衡分发连接
- Master 仅在收到 HUP 信号时,拉起新 Worker 并通知旧 Worker 优雅退出
多端口配置的实际写法不影响 Master 管理逻辑
无论是单个 server 块里写多个 listen,还是拆成多个 server 块,Master 都统一收集、统一预检、统一创建套接字:
-
server { listen 80; listen 8080; }→ Worker 同时监听两个端口 -
server { listen 80; } server { listen 443 ssl; }→ Worker 同时监听 80 和 443 - 不同 server 的 listen 绑定不同 IP(如 127.0.0.1:8080 和 0.0.0.0:80),Worker 仍全部执行 bind
只要配置语法合法、地址可达、端口可用,Master 就能协调全部 Worker 正确初始化所有监听端口。


















