在nginx/sbin目录下,有一个文件叫nginx,是nginx的二进制可执行文件,当nginx需要升级的时候,我们可以直接将新的nginx二进制文件替换掉这个旧的二进制文件。然后通过热部署,实现nginx版本的平滑升级。
热部署的步骤如下:
- 备份sbin目录下旧的nginx
- 将升级过的nginx二进制文件放入sbin目录下
- 用ps -ef | grep nginx命令找到旧nginx的master进程的pid(假设值为1000)
- 给1000号进程发送命令:kill -USR2 1000(这时候执行ps -ef | grep nginx命令可以看到系统重新开启了一个nginx master进程以及n个worker进程,旧的nginx master进程和worker进程依旧存在,只是旧的nginx不在监听设置的端口,现在请求会平滑过渡到新的nginx进程上)。还会发现,新的master进程的父进程id就是旧的master进程的id
- master进程会将nginx.pid文件重命名为nginx.oldbin,并将新的master pid存放在nginx.pid文件中
- 向旧的nginx发送关闭信号:kill -WINCH 1000(这时候旧的nginx worker已经kill掉了,但是旧的nginx master依旧存在,这是因为为了做版本回退)
回滚流程:
- 向旧的master发送HUP信号,旧的master进程会重新拉起一个worker进程(黄色区域的worker进程的父进程id为就的master进程的id)
- 向新的master发送QUIT信号,新的master进程会及其它的worker进程都会退出,并且删除master.pid文件,恢复master.oldbin文件为master.pid文件