Nginx学习笔记(十一)——高性能服务器---平滑升级与版本回退

1.nginx热部署

运行nginx服务开启的进程:

Ngnix中的进程分为两类,一类是master进程,一类是worker进程

其中master进程是用来管理监控控制其下边的worker进程的主进程,这个进程由root发起,其中原因是http这个服务需要启用80端口,而只有root才有权限启用80端口

顾名思义,worker进程才是真正working的进程,才是真正处理请求的进程
这些进程全部都是master进程的子进程,这些进程是以普通用户的身份进行运行的,这样就可以极大增加程序的安全性,就算是万一有一个进程被劫持,那也不会有管理员权限
worker进程中,原生的功能只有最基本的web服务。但是由于nginx是高度模块化的应用程序,所以在每一个worker进程中,有着一个或者多个模块。
需要注意的是,装载的模块可不是全部一次加载进去的,只有当这个进程真的需要这个模块的时候,才会被这个工作进程加载
由于nginx这个高度模块化的机制,也成就了其高效轻量的特点

进行热部署的前提条件:

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

热部署:

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

2.平滑升级

为什么要平滑升级呢?
如果我们想要更新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 5019		#5019为nginx老进程的pid
kill -WINCH 5019

在这里插入图片描述
注意:此时原来的nginx的master并没有宕掉,只是不在接收请求,当有需要时,我们可以唤醒它

step8 测试:

/usr/local/nginx/sbin/nginx -v	#升级成功
/usr/local/nginx/sbin/nginx -V

在这里插入图片描述
注意:

  • 在编译新版本的时候configure make结束不要makeinstall,这会覆盖原来的nginx
    此处只进行编译步骤(make)不执行安装步骤(make install)因为make install命令的本质就是将编译好的文件复制到对应的目录中。所以此处省略make install以防止某些老的配置文件被覆盖,我们只是为了升级nginx,原来的配置需要保持不变,所以要确保配文件不会被覆盖。
  • 不要制作软链接
    使用这种方法有一个前提:就是你在启动nginx时使用的是nginx二进制文件的绝对路径,而不是直接在命令行中输入"nginx"的方式启动的nginx服务,如果没有通过绝对路径启动nginx那么当你向nginx进程中发送更新的信号时,nginx进程可能会无法找到新的二进制程序

3.版本回退

step1 先还原nginx脚本:

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

在这里插入图片描述
step2 重新唤起旧版本的master进程,让其接收请求

kill -HUP 5019

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

kill -USR2 7545
kill -WINCH 7545

在这里插入图片描述
注意:这里一定要分清新老版本的进程pid

step4 测试:
查看nginx版本,回退到旧版本:

/usr/local/nginx/sbin/nginx -v
/usr/local/nginx/sbin/nginx -V

在这里插入图片描述

发布了184 篇原创文章 · 获赞 7 · 访问量 3631

猜你喜欢

转载自blog.csdn.net/weixin_43936969/article/details/104565177
今日推荐