# 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进程优雅的退出,这就实现了一个回滚。