平滑升级:在不关闭老进程的情况下启动新进程,业务持续运行,新进程逐步取代老进程,实现平滑升级
首先确认旧的nginx进程是存在在的
ps aux | grep nginx
开始编译安装新版本1.18.0的nginx
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -xzvf nginx-1.18.0.tar.gz -C /usr/local/
先获取旧版本nginx编译的选项
/usr/local/nginx/sbin/nginx -V
拿到这个选项,然后放在新版本nginx里面,执行configure
cd /usr/local/nginx-1.18.0.tar.gz
./configure --prefix=/usr/local/nginx --group=nginx --user=nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/tmp/nginx/client_body --http-proxy-temp-path=/tmp/nginx/proxy --http-fastcgi-temp-path=/tmp/nginx/fastcgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre --with-http_realip_module --with-stream
新下载的nginx在执行./configure的时候--prefix指向旧版本的nginx的安装目录
make
先备份旧的nginx二进制可执行程序
cd /usr/local/nginx/sbin/nginx
cp nginx nginx.back
找到nginx-1.18.0新版本的nginx的二进制执行程序
cd /usr/local/nginx-1.18.0/
cd objs
里面的这个nginx
就是我们要拿到的新版本的nginx可执行程序文件
使用nginx-1.18.0的二进制文件将nginx-1.16.0的二进制文件进行强制覆盖
[root@mmy objs]# cp -f nginx /usr/local/nginx/sbin/nginx
cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y
设定旧的服务不再接收用户请求(下线),新服务启动子进程接收用户请求(上线)
先查看当前未升级的nginx进程(这是旧版本的nginx进程)
ps aux | grep nginx
找到nginx父进程(master)的pid号,现在对其发送USR2
信号
kill -USR2 17440
#设定新的子进程开始接收用户的访问请求,旧的不再接受用户的访问请求
再次查看进程
ps aux | grep nginx
现在是nginx的新老版本的进程共存的一种情况。虽然现在旧版本的nginx进程还存在,但是已经不再接受用户的请求了。除此之外,旧版本的nginx进程也依然处于监听的状态,我们通过lsof命令可以看到,比如:
虽然在监听,但实际不会处理新连接,因为fd已经从epoll中移出了。另外,旧master是新master的父进程,所以新master才能共享打开的监听端口。保留旧版本的master是为了方便回滚(当然你可以发信号QUIT或者直接杀掉进程)
进行旧服务进程的关闭
kill -WINCH 17440
# 进行旧服务进程的关闭,该pid号是旧版本的nginx的master进程的pid号
再次查看当前nginx进程
可以看到现在的旧版本的nginx的worker进程已经全部被杀死了,只剩下的旧版本nginx的master进程
确定升级没有任何问题的话,可以把这个master进程给杀掉。
kill -QUIT 17440
#把旧master进程杀掉
再次查看进程只剩下新的nginx进程,版本也是最新的版本,到此nginx平滑升级完成