Nginx 架构

架构

Nginx启动后,会创建预定义好的套接字资源。之后根据配置创建多个子进程。多个子进程共享同一个监听 socket,当有新连接到来时,

Linux 4.5+ 的内核使用 EPOLLEXCLUSIVE 实现仅唤醒一个进程来处理连接,避免惊群效应。旧版本则需通过用户态互斥机制控制,如 accept_mutex

1
2
3
4
5
master process 
- worker process # 多个工作线程
- worker process
- Cache Manager # 缓存管理器
- Cache Loader # 缓存加载器

Master进程

当子进程退出(包括异常退出)后,内核会向Master发送SIGCHLD信号,通过子进程退出,在Master内核态切换回用户态时会检查信号位表,查询退出的子进程信息,并创建新的进程。

master支持的信号 :

信号 说明 等效命令行
SIGHUP 重新加载配置,平滑重启服务 nginx -s reload
SIGQUIT 优雅退出(处理完当前连接后退出) nginx -s quit
SIGTERM 强制退出(立即关闭) nginx -s stop
SIGINT 强制退出(Ctrl+C 等) 等同于 SIGTERM
SIGUSR1 重新打开日志文件(用于 logrotate) nginx -s reopen
SIGUSR2 启动二进制热升级 (不中断服务) 手动 kill -USR2
SIGWINCH 停止 worker 进程(仅 master 运行) 内部调试或模块使用

worker支持的信号 : (可以直接向worker进程发送信号,但更推荐向父进程发送信号由父进程统一管理)

信号 说明
SIGQUIT 优雅退出,处理完当前连接再关闭
SIGTERM 立即终止,强制退出
SIGINT 立即终止(类似 SIGTERM)
SIGWINCH 停止接收连接并退出(仅特定模块)
SIGUSR1 重新打开日志文件
SIGALRM 用于内部超时控制
SIGIO 高速事件通知(用于 aio 模式)
SIGCHLD 接收子进程退出信号(master 专用)

热部署

  • 替换旧的 nginx 可执行文件为新版
  • 向旧 master 进程发送 SIGUSR2 信号,触发热升级
  • 旧 master 写出 .oldbin pid 文件
  • 新 nginx 可执行文件启动新的 master + worker
  • 向旧 master 发送 SIGWINCH,优雅退出旧 worker
  • 若需回滚,向旧 master 发送 HUP 恢复旧 worker,向新 master 发送 QUIT 退出新进程

配置参数

1
2
3
4
5
6
7
8
9
--prefix             指定安装目录
--user 指定运行子进程的用户
--group 指定运行子进程的用户组
--pid-path 存放进程运行pid文件的路径
--conf-path 配置文件nginx.conf的存放路径
--error-log-path 错误日志error.log的存放路径
--http-log-path 访问日志access.log的存放路径
--with-pcre pcre库的存放路径
--with-zlib zlib库的存放路径

Nginx 架构
http://gadoid.io/2025/05/18/Nginx-架构/
作者
Codfish
发布于
2025年5月18日
许可协议