nginx平滑升级、回退

进行热部署的前提条件(也就是为什么nginx可以进行热部署)

nginx 的热部署和其并发模型有着密不可分的关系,是因为 master 进程和worker进程的关系
当系统通知 ngnix 重读配置文件的时候,master 进程会进行语法错误的判断
如果存在语法错误的话,返回错误,不进行装载;如果配置文件没有语法错误,那么 ngnix 也不会将新的配置调整到所有 worker 中
而是,先不改变已经建立连接的 worker,等待 worker 将所有请求结束之后,将原先在旧的配置下启动的 worker 杀死
然后使用新的配置创建新的 worker
所以可以做到在线更新版本,新版本和旧版本的进程可以同时存在,不影响客户的访问

什么是热部署

热部署在nginx中还是一个强大的功能,就是在线升级
其原理就是首先我们先会替换master进程,同时我们替换的master是与老版本的worker兼容的
下一步,就是想大家已经想到的一样。保持还有连接的worker进程,待其老去退休,进行替换
高度的模块化加上精巧的两层模型,让ngnix成为大家非常热爱的web service实现的方案
nginx支持热加载热部署 ,其实就是在不打断用户请求的情况下更新版本,也就是在线更新版本

热部署的分类?

(1)热部署成功(平滑更新)
在线更新nginx服务的版本并且更新成功,这个时候nginx的新版本和旧版本进程都可以同时工作,不影响客户的正常访问
(2)热部署失败(回滚)
在线更新nginx服务的版本并且更新失败,这个时候就直接回退到原来的nginx版本进程,保证客户可以正常访问

1:nginx平滑升级、回退

在这里插入图片描述解压
在这里插入图片描述注释,是Nginx比较小
在这里插入图片描述编译
在这里插入图片描述安装
在这里插入图片描述启动Nginx并查看进程,发现有1个worker进程和一个salve进程
在这里插入图片描述解压即将升级的版本
在这里插入图片描述注释
在这里插入图片描述同理,进行编译
在这里插入图片描述

升级

1)首先将之前的1.14版本的启动脚本备份

cd /usr/local/nginx/sbin
cp nginx nginx.old

在这里插入图片描述在这里插入图片描述在这里插入图片描述

2)再编译新版本1.15 'configure make结束不要make install,这会覆盖原来的nginx'     
注意:更新的时候不能make install,否则会将Nginx服务之前配置全部还原

在这里插入图片描述

cd /root/nginx-1.15.8/objs
cp -f nginx /usr/local/nginx/sbin/nginx
make后objs/下出现了二进制执行文件
make install 实际上就是将二进制执行文件和一些配置文件复制到/usr/local/nginx目录下

在这里插入图片描述在这里插入图片描述虽然当前版本已经变成了1.15版本,这个时候表面上看起来是更新成了新版本
但还是旧版本的在工作,接收客户端请求的仍然是1.14版本的nginx,这就有了下面的平滑升级
kill -USR2 旧版本的主进程号 (让旧版本的worker进程不再接受请求)
kill -WINCH 旧版本的主进程号 (关闭旧版本的worker进程)

在这里插入图片描述在这里插入图片描述

ps -ef | grep nginx可以看到原来的2个进程
kill -USR2 原来master进程的pid     ##不再让worker进程接收请求,当前请求处理完就让worker退出
ps -ef | grep nginx可以看到4个进程(新版本已经可以用了)
kill -WINCH 原来master进程的pid   关闭原来进程的子进程,master不结束,防止更新失败  处理完关闭
ps -ef | grep nginx可以看到3个进程(新版本已经可以用了)
/usr/local/nginx/sbin/nginx -V可以看到版本已经更新了

kill -USR2 旧版本的主进程号 (让旧版本的worker进程不再接受请求)
kill -WINCH 旧版本的主进程号 (关闭旧版本的worker进程)

3)向原来的nginx的master进程发送信号,不再接收新的请求,新的nginx程序开启worker进程,并且开始接收请求
kill -USR2 3607		##这个时候ps -ef看到两个master进程和其对应的worker进程
kill -WINCH 3607	##这个时候ps -ef看到老的worker进程结束,但master进程还在,不影响,是为了升级不成功时版本回退

4)执行/usr/local/nginx/sbin/nginx -v	##看到版本已经更新
/usr/local/nginx/sbin/nginx -V	##还可以看到编译的模块

在这里插入图片描述

回退

更新完毕后如果出现问题,我们立马停止更新的进程,回滚到原来版本的进程上面 这就是没有强制结束旧版本的master进程的原因,因为可以通过旧版本的master进程将旧版本的worker进程调用回来
加入我们刚才的更新失败,现在要回到原来的1.16版本

1)先还原nginx脚本

cd /usr/local/nginx/sbin
cp -f nginx.old nginx

2)重新唤起旧版本的master进程,让其接收请求

kill -HUP 3607	#-HUP相当于reload

3)让新版本的master进程不接收请求,关闭worker进程

kill -WINCH 6146

在这里插入图片描述
4)再查看nginx版本,回退到旧版本

/usr/local/nginx/sbin/nginx -v	##查看nginx版本
/usr/local/nginx/sbin/nginx -V	##查看nginx版本及编译参数等

其实最后剩余的新版本的worker进程也可以强制结束了,因为已经更新失败

cd nginx-1.14.2/
ls
cd objs/
cp -f nginx /usr/local/nginx/sbin/nginx
ps -ef | grep nginx
因为已经更新失败,新版本产生的进程已经全部结束

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值