Linux运维之路


nginx服务实战03: Nginx平滑升级与回滚

admin 2019-07-18 181浏览 0条评论
首页/正文
分享到: / / / /

Nginx平滑升级与回滚

在工作环境中,在某软件因为使用时间过长或新的bug及漏洞,导致服务不安全

这时候我们可能需要用到升级策略,以保证服务与数据的安全或性能的提升

接下来的文章会带大家学会企业中Nginx的升级与回滚策略

安装一个老版本的nginx

 #安装包下载:

[root@leilei ~]#cd /etc/yum.repos.d/
[root@leilei yum.repos.d]# wget http://mirrors.aliyun.com/repo/Centos-7.repo
[root@leilei ~]# cd /server/tools
[root@leilei tools]# wget http://nginx.org/download/nginx-1.14.0.tar.gz
[root@leilei tools]#  yum install -y pcre pcre-devel openssl openssl-devel gd-devel zlib-devel gcc
[root@leilei tools]# tar -xf nginx-1.14.0.tar.gz 
[root@leilei tools]# cd nginx-1.14.0/
[root@leilei nginx-1.14.0]# ./configure --prefix=/application/nginx-1.14 --user=www --group=www --with-http_image_filter_module  --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module

#判断安装:
[root@leilei nginx-1.14.0]# echo $?    
0

#安装
[root@leilei nginx-1.14]# make install

#创建软连接
ln -s /application/nginx-1.14/ /application/nginx

#添加环境变量:
echo "export PATH="$PATH:/application/nginx/sbin"">>/etc/profile

#重载变量配置
source/etc/profile

已经有nginx的同学可以不用看这些步骤

平滑升级nginx版本到 最新版 nginx

下载编译最新版本[已经安装的飘过此步骤]

编译参数 你可以通过 nginx -V 来获取你上一次nginx编译安装的参数

备份老版本的nginx启动文件:
[root@leilei]# cp -a  /application/nginx/sbin/nginx /root/

#通过不带软连接的绝对路径启动nginx
[root@leilei ~]# nginx  -s stop
[root@leilei ~]# /application/nginx-1.14/sbin/nginx 
[root@leilei ~]# ps -ef | grep nginx
root      82740      1  0 01:46 ?        00:00:00 nginx: master process /application/nginx-1.14/sbin/nginx
www       82741  82740  0 01:46 ?        00:00:00 nginx: worker process
root      82749  82690  0 01:46 pts/3    00:00:00 grep --color=auto nginx



到软件下载目录下载新版本:
[root@leilei ~]# cd /server/tools
[root@leilei tools]# wget http://nginx.org/download/nginx-1.15.0.tar.gz
[root@leilei tools]# tar -xf nginx-1.15.0.tar.gz 
[root@leilei tools]# cd nginx-1.15.0/

获取老版本编译参数:
[root@leilei nginx-1.15.0]# nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/application/nginx-1.14 --user=www --group=www --with-http_image_filter_module --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module

##使用老版本参数编译新版本:
[root@leilei nginx-1.15.0]# ./configure --prefix=/application/nginx-1.14 --user=www --group=www --with-http_image_filter_module --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module

## 预编译新版本
[root@leilei nginx-1.15.0]# ./configure --prefix=/application/nginx-1.14 --user=www --group=www --with-http_image_filter_module --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module

## 编译
[root@leilei nginx-1.15.0]# make
[root@leilei nginx-1.15.0]# echo $?
0


## 拷贝新的nginx启动文件替换老的启动文件
[root@leilei nginx-1.15.0]# cp -af objs/nginx /application/nginx-1.14/sbin/
cp: overwrite ‘/application/nginx-1.14/sbin/nginx’? y


## 查看进程
[root@leilei nginx-1.15.0]# ps -ef | grep nginx
root      82740      1  0 01:46 ?        00:00:00 nginx: master process /application/nginx-1.14/sbin/nginx
www       82741  82740  0 01:46 ?        00:00:00 nginx: worker process
root      85574  82690  0 01:49 pts/3    00:00:00 grep --color=auto nginx

##查看老版本master进程pid
[root@leilei nginx-1.15.0]# cat /application/nginx/logs/nginx.pid
85761


## 发送信号启动新版本的worker进程与老版本进程共同工作
[root@leilei nginx-1.15.0]# kill -USR2 `cat /application/nginx/logs/nginx.pid`
[root@leilei nginx-1.15.0]# ps -ef | grep nginx
root      82740      1  0 01:46 ?        00:00:00 nginx: master process /application/nginx-1.14/sbin/nginx
www       82741  82740  0 01:46 ?        00:00:00 nginx: worker process
root      85761  82740  0 01:52 ?        00:00:00 nginx: master process /application/nginx-1.14/sbin/nginx
www       85762  85761  0 01:52 ?        00:00:00 nginx: worker process
root      85767  82690  0 01:52 pts/3    00:00:00 grep --color=auto nginx

此时新老本都一起工作了,但是切记,此时老的master进程将不会在监听http或https端口了,新的连接新的端口都会进入到 新的进程中,此时我们应该向老进程发送 -WHINCH 让老的worker进程停止,保留master旧进程,此步骤是作为回退
出现问题可以通过  nginx -s reload命令重新启动旧进程


## 此时 我们发送信号给旧的 nginx 让他的老worker进程优雅关闭
[root@leilei nginx-1.15.0]# kill -WINCH `cat /application/nginx/logs/nginx.pid`

[root@leilei nginx-1.15.0]# ps -ef | grep nginx
root      82740      1  0 01:46 ?        00:00:00 nginx: master process /application/nginx-1.14/sbin/nginx
www       82741  82740  0 01:46 ?        00:00:00 nginx: worker process
root      85761  82740  0 01:52 ?        00:00:00 nginx: master process /application/nginx-1.14/sbin/nginx
root      85935  82690  0 01:55 pts/3    00:00:00 grep --color=auto nginx

这时候老的worker进程已经关闭了,但是master进程不会关闭,如果出现问题我们可以继续唤醒worker进程,此时没有问题


## 如果出现问题可以通过唤醒老进程方式,这样老的worker进程将会再次被唤醒
[root@leilei nginx-1.15.0]# ps -ef | grep nginx
root      82740      1  0 01:46 ?        00:00:00 nginx: master process /application/nginx-1.14/sbin/nginx
www       82741  82740  0 01:46 ?        00:00:00 nginx: worker process
root      85761  82740  0 01:52 ?        00:00:00 nginx: master process /application/nginx-1.14/sbin/nginx
www       86230  85761  0 02:01 ?        00:00:00 nginx: worker process
root      86243  82690  0 02:01 pts/3    00:00:00 grep --color=auto nginx


## 在确认无误后,我们可以让老的进程正式退出
[root@leilei nginx-1.15.0]# kill -QUIT `cat /application/nginx/logs/nginx.pid`
[root@leilei nginx-1.15.0]# ps -ef | grep nginx
root      82740      1  0 01:46 ?        00:00:00 nginx: master process /application/nginx-1.14/sbin/nginx
www       82741  82740  0 01:46 ?        00:00:00 nginx: worker process
root      86413  82690  0 02:05 pts/3    00:00:00 grep --color=auto nginx


此时我们已经正式切换为了新的版本。

升级注意

新版本我们需要进行make 但是

一定不要 make install

一定不要 make install

一定不要 make install

make install 回让新版本安装覆盖老版本,这是不可逆的操作,一定不要这样做。

升级关键参数说明:

kill -WINCH  通知旧的worker进程优雅的关闭,然后退出。 

kill -HUP    发送信号给旧的主进程,重新加载配置并讲旧的work进程拉起来

kill -QUIT   发送信号给新的主进程,让它优雅关闭所有的新进程,并恢复升级前的情况,如果你这样做,请恢复原来的配置文件

升级步骤总结

实现nginx热部署的前提:nginx是路径方式启动的

 执行步骤:     

 1. mv /application/nginx/sbin/nginx  ~    #备份原nginx执行文件
 
 2. cp [新的nginx文件] /application/nginx/sbin    #拷贝新的执行文件  

 3. kill -USR2 [旧的主进程id]       #通知旧的主进程将要进行升级

 4. kill -WINCH [旧的主进程id]     #通知旧的主进程优雅地关闭它的worker 进程
   4.1   kill -HUP [旧的主进程id]      #出现故障,拉起老进程,无故障不需要此步骤
 
 5. kill -QUIT [旧的主进程id]     #通知旧的主进程优雅的退出
最后修改:2019-07-18 09:15:25 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇

发表评论

评论列表

还没有人评论哦~赶快抢占沙发吧~