Nginx的热升级主要依赖Master-Worker进程模型以及信号机制来实现的。
1. Master-Worker进程模型
- Master 进程:在启动时,Nginx会创建一个Master进程,负责管理所有工作进程。Master进程主要负责初始化Nginx,读取配置文件,以及控制和管理所有工作进程。
- Worker 进程:Nginx会创建多个Worker进程,每个Worker进程都负责处理客户端的请求。Worker进程会被Master进程派遣任务,从而实现并行处理请求的能力。
2. Nginx中的信号管理机制
Nginx的信号管理机制是Nginx热升级的基石,因此在了解其热升级原理前,首先要了解其信号管理机制。
下面是Nginx中常用的信号及其作用:
TERM
:这是默认的关闭信号。当收到这个信号时,Nginx会优雅地关闭所有工作进程,允许它们完成当前的请求并关闭连接。QUIT
:这也是一个优雅关闭信号,与TERM
类似,但通常用于停止主进程。HUP
:重新加载配置文件。当Nginx接收到这个信号时,它会重新加载配置文件,而无需停止服务。这对于在不中断服务的情况下应用配置更改非常有用。USR1
:重新打开日志文件。当日志文件需要轮换时,可以向Nginx发送此信号。USR2
:平滑升级可执行文件。用于在不停止服务的情况下更新Nginx可执行文件。新的Nginx进程会启动,然后逐渐接管流量,旧的进程会逐渐关闭。WINCH
:优雅停止工作进程。这个信号可以用于关闭工作进程,但不会影响主进程。它可以让你逐渐地减少工作进程的数量。KILL
:强制关闭。这个信号会立即终止Nginx进程,不会进行清理或完成未完成的请求。QUIT
:优雅地关闭所有工作进程。
了解了上述信号,就要知道如何发送这些信号给Nginx进程,要向Nginx发送信号,可以使用kill
命令和进程ID,例如:
# SIGNAL:信号
# PID:进程号
sudo kill -s SIGNAL PID
3. Nginx热升级原理
了解了Nginx的进程模型和信号管理机制,接下来就来说说其热升级原理。
通过上面的信号管理机制,我们可以知道,通过给Nginx进程发送信号的方式来触发Nginx进程重新加载配置文件(HUP)、更新可执行文件(USR2)、优雅停止Worker进程(WINCH)以及优雅关闭所有Worker进程(QUIT)。Nginx热升级原理就是通过组合这些信号来实现优雅替换Nginx可执行文件,实现请求平滑迁移到新版本进程中。
基本步骤如下:
- 备份老版本可执行文件
- 准备新的可执行文件
- 向Master进程发送USR2信号
- Master进程启动新Worker进程
- 新Worker进程接管连接
- 旧Worker进程逐渐关闭
- 如果升级失败,则通过HUP信号重新加载配置,进行回滚
4. Nginx热升级实践
4.1 确定老版本版本号及进程号
当前版本:1.25.1
老版本master进程号:26346
4.2 备份老版本可执行文件以及配置文件
cd /usr/local/nginx
cp sbin/nginx ./sbin/nginx.20230919.old
cp -r conf conf.20230919.old
4.3 拷贝新的Nginx可执行文件
4.4 向老版本发送USR2信号,触发可执行文件替换
kill -USR2 26346
从图中可以看出,已经启动了一个新版本的Master进程,新版本Master进程号:30951
此时已经有请求路由到新版本进程中处理,已经可以验证新版本是否有问题。
4.5 如果验证没问题,可以通过WINCH信号停止老版本的请求处理
kill -WINCh 26346
从截图中,我们可以看出,老版本已经没有Worker进程了(图中Worker process 26347已经退出)
4.6 如果验证没问题,此时已经可以退出老版本的Master进程
kill -QUIT 26346
4.7 如果验证有问题,需要回滚,可以通过HUP信号
回滚可执行文件
回滚进程
kill -HUP 26346
通过给老版本进程发送HUP信号,可以使老版本重新加载配置文件并启动老版本Worker进程,后续就可以通过WINCH信号做新老版本进程之前的请求迁移。步骤参考4.5和4.6,本节不再赘述。
5. Nginx热升级的优势
- 无需停机时间:平滑升级使得Nginx可以在不中断服务的情况下完成升级,保证了网站的连续性和稳定性。
- 避免请求丢失:新的Worker进程会逐渐接管连接,这样可以避免在升级过程中出现请求丢失的情况。