nginx多进程架构中master进程创建并持有监听套接字,worker进程继承后调用accept()处理连接;master控制socket生命周期,worker负责收连接,reload时新旧套接字平滑切换。

Nginx 的多进程架构通过 Master 进程统一创建并持有监听套接字,再由 Worker 进程继承使用,实现资源隔离与高效分发。关键不在于“谁调用 accept”,而在于“谁控制 socket 生命周期”——Master 占住端口、Worker 负责收连接。
Master 进程负责套接字的创建与持有
启动时,Master 解析 nginx.conf 中所有 listen 指令(如 listen 192.168.1.10:80 或 listen [::]:443 ssl),逐个调用 socket()、bind()、listen() 创建监听套接字,并设置 SO_REUSEADDR(有时含 SO_REUSEPORT)。这些套接字始终保留在 Master 的文件描述符表中,但 Master 自身从不调用 accept()。
- 套接字归属 Master 进程:可用
ss -tlnp | grep :80查看 PID 对应 master - Master 不处理请求,只确保端口不被抢占,为 Worker 复用做好准备
- reload 时,Master 尝试新建套接字;成功则新 Worker 使用新套接字,旧 Worker 继续服务直至自然退出
Worker 进程通过继承获取并实际使用套接字
Master 在 fork Worker 时,操作系统自动将已打开的监听套接字文件描述符复制给子进程。每个 Worker 启动后,直接拥有对全部监听套接字的访问权,并在其事件循环中注册 read 事件,handler 设为 ngx_event_accept。
- 每个 Worker 独立调用
accept()从共享套接字上取连接(默认模式) - 若启用
reuseport,内核为每个 Worker 创建独立监听 socket,连接由内核直派,无需争抢 -
worker_connections限制的是每个 Worker 可同时处理的 client socket 数,不包含监听套接字本身
多 IP / 双栈监听由 Worker 统一完成绑定
配置多个地址(如 listen 10.0.0.1:80 和 listen [::1]:80)时,不是 Master 分配,而是每个 Worker 在初始化阶段主动遍历所有 listen 指令,逐一执行系统调用绑定。
- Worker 若遇到无效 IP(如网卡尚未配置该地址),会初始化失败并退出,Master 记录错误日志
- 通配地址(
0.0.0.0:80、[::]:80)成功率高;非通配地址需确保对应网卡已就位 - IPv6 地址必须用方括号包裹(
[::]:443),否则语法报错
连接分发机制决定是否需要锁
如何避免多个 Worker 同时唤醒处理一个连接(即“惊群”),取决于底层机制:
- 未启用
reuseport时,依赖accept_mutex(1.11.3 后默认关闭),Worker 轮流争抢 accept 权限 - 启用
reuseport后,内核在多个监听 socket 间负载均衡,accept_mutex自动失效,建议显式设为off - Master 从不参与连接分发决策,它只响应信号(如 HUP)并协调新旧 Worker 切换











