Nginx无论是运维、开发还是测试,都是日常工作中需要掌握的知识点。今天,我们就来说说。生产环境经常遇到的一种情况,升级Nginx到新版本以及如何回滚到旧版本。一、环境介绍今天准备的两个nginx版本如下:[root@nginx~]#cd/download/nginx/[root@nginxnginx]#lltotal1952-rw-r--r--1rootroot981687Oct172017nginx-1.12.2.tar.gz-rw-r--r--1rootroot1015384Dec409:58nginx-1.14.2.tar.gz2,编译安装新旧版本编译安装nginx-1.12.2[root@nginxnginx]#tarzxfnginx-1.12.2。tar.gz[root@nginxnginx]#cdnginx-1.12.2[root@nginxnginx-1.12.2]#./configure--prefix=/usr/local/nginx-1.12.2[root@nginxnginx-1.12.2]#echo$?0[root@nginxnginx-1.12.2]#make&&makeinstall[root@nginxnginx-1.12.2]#echo$?0[root@nginxnginx-1.12.2]#ll/usr/local/nginx-1.12。2/total0drwxr-xr-x2rootroot333Mar109:01confdrwxr-xr-x2rootroot40Mar109:01htmldrwxr-xr-x2rootroot6Mar109:01logsdrwxr-xr-x2rootroot19Mar109:01sbin编译安装nginx-1.14.2[root@nginx~]/ngind/download[cd/download@nginarxnginxf]#t1.14.2.tar.gz[root@nginxnginx]#cdnginx-1.14.2[root@nginxnginx-1.14.2]#./configure--prefix=/usr/local/nginx-1.14.2[root@nginxnginx-1.14.2]#echo$?0[root@nginxnginx-1.14.2]#make&&makeinstall[root@nginxnginx-1.14.2]#echo$?0[root@nginxnginx-1.14.2]#ls-l/usr/local/nginx-1.14.2/total0drwxr-xr-x2rootroot333Mar109:03confdrwxr-xr-x2rootroot40Mar109:03htmldrwxr-xr-x2rootroot6Mar109:03logsdrwx-xr-x2rootroot19Mar109:03sbin这里部署了两个版本的nginx软件3.启动老版本的nginx[root@nginx~]#/usr/local/nginx-1.12.2/sbin/nginx-tnginx:theconfigurationfile/usr/local/nginx-1.12.2/conf/nginx.confsyntaxisoknginx:配置文件/usr/local/nginx-1.12.2/conf/nginx.conftestissuccessful[root@nginx~]#/usr/local/nginx-1.12.2/sbin/nginx[root@nginx~]#ps-ef|grepnginxroot63241009:06?00:00:00nginx:masterprocess/usr/local/nginx-1.12.2/sbin/nginxnobody63256324009:06?00:00:00nginx:workerprocessroot63271244009:06pts/000:00:00grep--color=autonginx[root@nginx~]#lsof-i:80COMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAMEnginx6324root6uIPv4263240t0TCP*:http(LISTEN)nginx6325nobody6uIPv4263240t0TCP*:http(LISTEN)4.升级到新版本其实就是对二进制文件的升级。过程如下:[root@nginx~]#/usr/local/nginx-1.12.2/sbin/nginx-vnginxversion:nginx/1.12.2[root@nginx~]#cd/usr/local/nginx-1.12.2/sbin/[root@nginxsbin]#mvnginxnginx-1.12.2#先备份原来老版本的nginx二进制文件[root@nginxsbin]#cp/usr/local/nginx-1.14.2/sbin/nginx./#将新版本的二进制文件复制到当前目录,然后进行平滑升级操作[root@nginx~]#ps-ef|grepginxroot63241009:06?00:00:00nginx:masterprocess/usr/local/nginx-1.12.2/sbin/nginxnobody63256324009:06?00:00:00nginx:workerprocessroot63381244009:11pts/000:00:00grep--color=autonginx[root@nginx~]#kill-USR26324[root@nginx~]#ps-ef|grepginxroot63241009:06?00:00:00nginx:masterprocess/usr/local/nginx-1.12.2/sbin/nginxnobody63256324009:06?00:00:00nginx:workerprocessroot63406324009:12?00:00:00nginx:masterprocess/usr/local/nginx-1.12.2/sbin/nginxnobody63416340009:12?00:00:00nginx:workerprocessroot63431244009:12pts/000:00lor=autongrep--x新主进程已经正常启动了,但是老的工作进程也存在,所以我们用下面的命令来通知老的工作进程顺利停止,如下:[root@nginx~]#kill-WINCH6324[root@nginx~]#ps-ef|grepginxroot63241009:06?00:00:00nginx:masterprocess/usr/local/nginx-1.12.2/sbin/nginxroot63406324009:12?00:00:00nginx:masterprocess/usr/local/nginx-1.12.2/sbin/nginxnobody63416340009:12?00:00:00nginx:workerprocessroot63461244009:14pts/000:00:00grep--color=autonginx此时老工作进程已经停止了,接下来我们测试是否可以正常访问:可以正常访问,其实这个平滑的升级动作,针对访问用户完全感觉不到,所以nginx热部署已经完成[root@nginx~]#/usr/local/nginx-1.12.2/sbin/nginx-vnginxversion:nginx/1.14.2查看版本也是***版本,升级完成。注意:如果版本升级完成后没有问题,如果需要关闭老master进程,可以使用如下命令:kill-QUITold_master_PID5,版本回滚对于升级,最难的是不升级,但回滚。因为在实际生产环境中存在回滚的可能,例如:新版本由于一些未知的bug导致与现有应用不兼容,或者运行不稳定等。因此,对于运维工程师来说,故障回滚是关键。在上面的结果中,我们也可以看到老master进程一直存在,只有手动关闭它才会自己关闭。这种设计是有益的。好处是升级新版本后,如果出现问题,可以及时快速回滚到之前的稳定版本。[root@nginx~]#ps-ef|grepginxroot63241009:06?00:00:00nginx:masterprocess/usr/local/nginx-1.12.2/sbin/nginxroot63406324009:12?00:00:00nginx:masterprocess/usr/local/nginx-1.12.2/sbin/nginxnobody63416340009:12?00:00:00nginx:workerprocessroot63501244009:23pts/000:00:00grep--color=autonginx[root@nginx~]#cd/usr/local/nginx-1.12。2/sbin/[root@nginxsbin]#mvnginxnginx-1.14.2[root@nginxsbin]#mvnginx-1.12.2nginx[root@nginxsbin]#kill-USR16324[root@nginxsbin]#ps-efgrepginxroot63241009:06?00:00:00nginx:masterprocess/usr/local/nginx-1.12.2/sbin/nginxroot63406324009:12?00:00:00nginx:masterprocess/usr/local/nginx-1.12.2/sbin/nginxnobody63416340009:12?00:00:00nginx:workerprocessroot63551244009:24pts/000:00:00grep--color=autonginx[root@nginxsbin]#./nginx-vnginxversion:nginx/1.12.2从上面的结果发现回滚的是之前的版本顺利,接下来测试是否可以正常访问:也可以正常访问,所以这个回滚操作也是用户察觉不到的。
