1. 平滑升级
为什么要平滑升级呢?
如果我们想要更新nginx,但它的更新也要耗费一定的时间。而平滑升级可以做到在线升级,保证不影响客户的使用,并且升级后新版本对服务端的数据也不会覆盖。
step1 需要两个不同版本的nginx安装包:
这里我的是:nginx-1.14.2.tar.gz nginx-1.16.1.tar.gz
step2 先安装一个版本较低的nginx:
tar zxf nginx-1.14.2.tar.gz
yum install gcc openssl-devel pcre-devel -y
cd nginx-1.14.2
./configure --prefix=/usr/local/nginx
make && make install
step3 开启nginx:
cd /usr/local/nginx/sbin/
./nginx
netstat -antlp | grep nginx #查看端口信息
/usr/local/nginx/sbin/nginx -v #查看版本信息
/usr/local/nginx/sbin/nginx -V #查看编译信息
step4 将之前的启动脚本备份:
cp nginx nginx.old
step5 编译安装另一个安装包:
tar zxf nginx-1.16.1.tar.gz
cd nginx-1.16.1
./configure --prefix=/usr/local/nginx #根据老版本的编译选项对新版本进行编译
make #make结束不要make install
step6 覆盖老版本的启动脚本:
cd /usr/local/nginx/sbin/
cp -f /root/nginx-1.16.1/objs/nginx . #覆盖老版本的启动脚本
step7 向原来的nginx的master进程发送信号,不再接受新的请求:
新的nginx程序开启worker进程,并且开始接收请求:
ps -ef | grep nginx | grep -v grep #查看进程
kill -USR2 4667 #4667为nginx老进程的pid
kill -WINCH 4667
注意:此时原来的nginx的master并没有宕掉,只是不在接收请求,当有需要时,我们可以唤醒它
step8 测试:
/usr/local/nginx/sbin/nginx -v #升级成功
/usr/local/nginx/sbin/nginx -V
注意:
在编译新版本的时候configure make结束不要make install,这会覆盖原来的nginx
此处只进行编译步骤(make)不执行安装步骤(make install)因为make install命令的本质就是将编译好的文件复制到对应的目录中。所以此处省略make install以防止某些老的配置文件被覆盖,我们只是为了升级nginx,原来的配置需要保持不变,所以要确保配文件不会被覆盖。不要制作软链接
使用这种方法有一个前提:就是你在启动nginx时使用的是nginx二进制文件的绝对路径,而不是直接在命令行中输入"nginx"的方式启动的nginx服务,如果没有通过绝对路径启动nginx那么当你向nginx进程中发送更新的信号时,nginx进程可能会无法找到新的二进制程序
2. 版本回退
step1 先还原nginx脚本:
cd /usr/local/nginx/sbin
cp -f nginx.old nginx
step2 重新唤起旧版本的master进程,让其接收请求:
ps -ef | grep nginx | grep -v grep
kill -HUP 4667
step3 让新版本的master进程不再接收请求,关闭worker进程:
kill -USR2 7197
kill -WINCH 7197
注意:这里一定要分清除新老版本的进程pid
step4 测试:
查看nginx版本,回退到旧版本:
/usr/local/nginx/sbin/nginx -v
/usr/local/nginx/sbin/nginx -V