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 流程

  1. master 进程对配置文件进行语法检查
  2. 尝试配置
  3. 尝试成功则使用新的配置,新建 worker 进程
  4. 新建成功,给旧的 worker 进程发送关闭的消息
  5. 旧的 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,减少锁竞争