# Nginx 热部署流程解析

# 将旧Nginx文件换成新Nginx文件(注意备份)

大部分场景下,我们新编译的nginx文件所指定的相应的配置选项,比如说配置文件的目录在哪里,log所在的目录在哪里等等,必须保持和老的nginx是一致的,这种情况下只替换二进制文件即可。

如果我们只替换二进制文件,请注意我们要备份。在替换的时候,新版本的linux中要求你在覆盖一个正在使用的文件时,使用 cp 命令时加上 -f 选项。

# 向老的master进程发送USR2信号

使用 kill 指令指定老的master进程的进程 pid,发送 USR2信号。发送完 USR2 信号以后,老的master进程会做以下几件事。

# 老的master进程修改pid文件名,加后缀.oldbin

这样做是为了给新的master进程让路。

虽然master进程和worker进程,他们都可以接受信号。但是为了管理方便,我们通常不会对worker进程直接发送信号。

为了让新的master使用 pid.bin 这样一个文件名,所以我们先把老的 pid 文件改名。

# 老的master进程用新Nginx文件启动新master进程

老的master用新的二进制文件启动新的master进程,所以到此为止会出现两个master进程和老的worker进程。

新的master进程会自动地去启动新的worker进程。

# 向老的master进程发送WINCH信号,优雅关闭老的worker进程

我们可以通过用 ps 看到master进程的 pid 或者通过 .oldbin 文件找到老的master进程的 pid

然后向老的master进程发送WINCH信号。

老的master进程会优雅的关闭老的worker进程。这样的话,我们的热升级就结束了。

# 回滚

向老master发送HUP,向新master发送QUIT

上面,热部署结束后老的master进程一直是保存下来的,这是为了方便我们回滚。

当我们发现新的nginx程序有问题了,这时候因为老的master进程还在,所以我们通过向它发送HUP信号,相当于执行了一次reload,它会起新的worker进程,再向新的master发送QUIT信号,也就是要求其对应的新的worker进程优雅的退出,这就实现了一个回滚。

# 参考

更新时间: 9/22/2020, 3:49:41 AM