Nginx 架构
架构
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 写出
.oldbin
pid 文件 - 新 nginx 可执行文件启动新的 master + worker
- 向旧 master 发送
SIGWINCH
,优雅退出旧 worker - 若需回滚,向旧 master 发送
HUP
恢复旧 worker,向新 master 发送QUIT
退出新进程
配置参数
1 |
|
Nginx 架构
http://gadoid.io/2025/05/18/Nginx-架构/