Nginx 架构
本文最后更新于 2025年5月18日 凌晨
架构
Nginx启动后,会创建预定义好的套接字资源。之后根据配置创建多个子进程。多个子进程共享同一个监听 socket,当有新连接到来时,
Linux 4.5+ 的内核使用 EPOLLEXCLUSIVE 实现仅唤醒一个进程来处理连接,避免惊群效应。旧版本则需通过用户态互斥机制控制,如 accept_mutex。
1 | |
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 写出
.oldbinpid 文件 - 新 nginx 可执行文件启动新的 master + worker
- 向旧 master 发送
SIGWINCH,优雅退出旧 worker - 若需回滚,向旧 master 发送
HUP恢复旧 worker,向新 master 发送QUIT退出新进程
配置参数
1 | |
Nginx 架构
http://gadoid.io/2025/05/18/Nginx-架构/