Main Content
Nginx 之所以能在同一台服务器上支撑数十万并发连接,根本原因不是”高魔法”配置,而是 Master–Worker 多进程 + 事件驱动 的组合设计。Master 进程负责管控,Worker 进程负责真正的网络 I/O。
Master 进程
- 主要是管理 Worker 进程,接受外界的信息向各 Worker 进程发送信号
- 监控 Worker 进程的运行状态,当 Worker 进程异常退出后自动重新启动新的 Worker 进程
- 读取并解析 nginx.conf,建立共享内存区
- 根据 worker_processes 指令(默认 auto)派生 Worker
- 接收外部信号(-s reload|quit|stop|reopen)并向 Worker 广播
Worker 进程
- Worker 进程具体处理网络请求,多个 Worker 进程之间是对等的
- 一个请求,只可能在一个 Worker 中处理
- Worker 进程的个数一般设置于 CPU 的核心数一样
- 每个 Worker 单线程运行,以 epoll(Linux)或 kqueue(FreeBSD/macOS) 监听所有连接事件
连接接收机制
- 默认所有 Worker 共同监听同一套端口
- 通过 accept_mutex 锁避免惊群
- worker_connections × worker_processes 即理论并发连接上限
nginx -s reload 流程
- master 进程对配置文件进行语法检查
- 尝试配置
- 尝试成功则使用新的配置,新建 worker 进程
- 新建成功,给旧的 worker 进程发送关闭的消息
- 旧的 worker 进程收到信号会继续服务,直到当前进程收到的请求处理完毕后退出
Nginx 多进程好处
- 每个 Worker 进程都是独立的,不需要加锁,节省开销
- 每个 Worker 进程都是独立的,互不影响,一个异常结束,其他的照样可以提供服务
- 多进程模型为 reload 热部署提供了支撑
常用指令
- nginx -s reload — 平滑重载配置 (SIGHUP),零中断换配置
- nginx -s quit — 优雅下线 (SIGQUIT),处理完现有连接再退出
- nginx -s stop — 强制终止 (SIGTERM),立即退出
- nginx -s reopen — 重开日志 (SIGUSR1),日志切割不重启
新特性 (Nginx 1.28)
- 原生支持 QUIC/HTTP/3
- 引入 CUBIC 拥塞控制,大流量高延迟场景下文件传输提速 24%–73%
- 可结合 reuseport on 让每个 Worker 拥有独立监听 FD,减少锁竞争