文章目录

  • 一、什么是nginx热部署
  • 1、nginx服务开启的进程情况
  • 2、进行热部署的前提条件(也就是为什么nginx可以进行热部署)
  • 3、什么是热部署
  • 4、热部署的分类
  • 二、nginx版本的平滑更新与回滚实验
  • 实验环境
  • 实验
  • 1、nginx平滑升级
  • (1)模拟实验情况,安装nginx-1.16.1版本
  • (2)nginx平滑升级至nginx-1.17.8版本
  • 2、nginx版本更新失败之后的回滚


一、什么是nginx热部署

1、nginx服务开启的进程情况

Ngnix中的进程分为两类,一类是master进程,一类是worker进程,其中master进程是用来管理监控控制其下边的worker进程的主进程,这个进程由root发起。

原因是http这个服务需要启用80端口,而只有root才有权限启用80端口。而顾名思义,worker进程才是真正working的进程,才是真正处理请求的进程,这些进程全部都是master进程的子进程,这些进程是以普通用户的身份进行运行的,这样就可以极大增加程序的安全性。就算是万一有一个进程被劫持,那也不会有管理员权限   
Worker进程中,原生的功能只有最基本的web服务。但是由于nginx是高度模块化的应用程序,所以,在每一个worker进程中,有着一个或者多个模块。

但是需要注意的是,装载的模块可不是全部一次加载进去的,只有当这个进程真的需要这个模块的时候,才会被这个工作进程加载
在我看来,模块化的思想和面向对象的思想,是推动现代整个开发的重要思想

由于nginx这个高度模块化的机制,也成就了其高效轻量的特点)

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

nginx 的热部署和其并发模型有着密不可分的关系,是因为 master 进程和worker进程的关系。

当系统通知 ngnix 重读配置文件的时候,master 进程会进行语法错误的判断,如果存在语法错误的话,返回错误,不进行装载;如果配置文件没有语法错误,那么 ngnix 也不会将新的配置调整到所有 worker 中,而是先不改变已经建立连接的 worker,等待 worker 将所有请求结束之后,将原先在旧的配置下启动的 worker 杀死
然后使用新的配置创建新的 worker。

所以可以做到在线更新版本,新版本和旧版本的进程可以同时存在,不影响客户的访问。

3、什么是热部署

热部署在nginx中还是一个强大的功能,就是在线升级。
其原理就是首先我们先会替换master进程,同时我们替换的master是与老版本的worker兼容的。下一步,就是想大家已经想到的一样。保持还有连接的worker进程,待其老去退休,进行替换。

高度的模块化加上精巧的两层模型,让ngnix成为大家非常热爱的web service实现的方案

nginx支持热加载热部署 ,其实就是在不打断用户请求的情况下更新版本,也就是在线更新版本。

4、热部署的分类

(1)热部署成功(平滑更新)
在线更新nginx服务的版本并且更新成功,这个时候nginx的新版本和旧版本进程都可以同时工作,不影响客户的正常访问

(2)热部署失败(回滚)
在线更新nginx服务的版本并且更新失败,这个时候就直接回退到原来的nginx版本进程,保证客户可以正常访问

二、nginx版本的平滑更新与回滚实验

实验环境

主机名

ip

功能

server1

172.25.1.1

nginx服务器

真机

172.25.1.250

客户端,用来测试

实验
1、nginx平滑升级
(1)模拟实验情况,安装nginx-1.16.1版本

步骤一:在官网上下载nginx安装包并解压

下载地址:nginx官网安装包下载

centos的nginx怎么更新配置文件 nginx版本更新_nginx


步骤二:修改源码编译gcc配置文件

cd nginx-1.16.1
vim auto/cc/gcc

# debug
#CFLAGS="$CFLAGS -g" ##本行注释掉,关闭debug日志模式

centos的nginx怎么更新配置文件 nginx版本更新_热部署_02


这里我们先不用隐藏版本号,方便最后查看实验效果

步骤三:安装编译环境

yum install gcc openssl-devel -y

centos的nginx怎么更新配置文件 nginx版本更新_旧版_03


步骤四:编译

./configure --prefix=/usr/local/nginx --with-file-aio

centos的nginx怎么更新配置文件 nginx版本更新_热部署_04


步骤五:编译安装

make && make install

centos的nginx怎么更新配置文件 nginx版本更新_nginx_05


步骤六:启动脚本做软链接

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

centos的nginx怎么更新配置文件 nginx版本更新_旧版_06

步骤七:修改配置文件,设置nginx为所有人所有组,并进行语法检测

vim /usr/local/nginx/conf/nginx.conf
user  nginx nginx;

centos的nginx怎么更新配置文件 nginx版本更新_旧版_07


步骤八:创建用户

useradd nginx

centos的nginx怎么更新配置文件 nginx版本更新_旧版_08


步骤九:语法检测

nginx -t

centos的nginx怎么更新配置文件 nginx版本更新_旧版_09


步骤十:开启nginx服务,查看进程

nginx
ps aux

centos的nginx怎么更新配置文件 nginx版本更新_旧版_10

centos的nginx怎么更新配置文件 nginx版本更新_nginx_11

(2)nginx平滑升级至nginx-1.17.8版本

一天只能更新一次,实际企业当中也不是每天都更新

步骤一:下载nginx最新版安装包

centos的nginx怎么更新配置文件 nginx版本更新_热部署_12


步骤二:查看当前版本号

nginx -V

centos的nginx怎么更新配置文件 nginx版本更新_热部署_13


步骤三:解压安装包

tar zxf nginx-1.17.8.tar.gz

centos的nginx怎么更新配置文件 nginx版本更新_旧版_14


步骤四:进入解压目录,进行编译

cd nginx-1.17.8
./configure --prefix=/usr/local/nginx --with-file-aio

centos的nginx怎么更新配置文件 nginx版本更新_旧版_15


步骤五:编译

make

centos的nginx怎么更新配置文件 nginx版本更新_旧版_16


注意不能make install

make后objs/下出现了二进制执行文件

make install 实际上就是将二进制执行文件和一些配置文件复制到/usr/local/nginx目录下

步骤六:将原来的二进制系统程序文件备份一下,以防新升级后的nginx出问题可以方便恢复

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

centos的nginx怎么更新配置文件 nginx版本更新_热部署_17


步骤七:替换二进制文件

新版本通过编译之后,源码包里的objs目录里便有了新的nginx文件,替换原来的nginx二进制文件

cd nginx-1.17.8
cd objs/
cp -f nginx /usr/local/nginx/sbin/nginx  

##-f 强制,如果不加-f,原来的nginx仍在运行,就不会覆盖

centos的nginx怎么更新配置文件 nginx版本更新_nginx_18


步骤八:查看当前版本

nginx -V   #此时查看到版本为最新版本

centos的nginx怎么更新配置文件 nginx版本更新_nginx_19


在客户端测试

curl -I 172.25.1.1

centos的nginx怎么更新配置文件 nginx版本更新_nginx_20


显示认为旧版本,因为此时任是旧版本worker线程在工作

ps -ef | grep nginx

centos的nginx怎么更新配置文件 nginx版本更新_旧版_21


步骤七:平滑升级

kill -USR2 旧版本的主进程号

让旧版本的worker进程不再接受请求

kill -WINCH 旧版本的主进程号

关闭旧版本的worker进程

(1)kill -USR2 旧版本主进程号
执行新的主进程(新版本)和新的工作进程,依次启动新的主进程和新的工作进程,现在新,旧版本的nginx实例会同时运行,共同处理请求

kill -USR2 4730

centos的nginx怎么更新配置文件 nginx版本更新_旧版_22

(2)kill -WINCH 旧版本主进程号
发送WINCH信号给旧版主进程,旧版主进程就开始从容关闭

kill -WINCH 4730

centos的nginx怎么更新配置文件 nginx版本更新_旧版_23


在客户端测试

curl -I 172.25.1.1

centos的nginx怎么更新配置文件 nginx版本更新_旧版_24


此时,nginx已经平滑升级成了新的版本对外工作

2、nginx版本更新失败之后的回滚

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

步骤一:将原来备份好旧版本的二进制文件的再复制回去

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

centos的nginx怎么更新配置文件 nginx版本更新_热部署_25


步骤二:回滚

kill -HUP 旧版本的进程

拉起旧版本的worker进程

kill -WINCH 新版本的主进程号

关闭新版本的worker进程

(1) kill -HUP 旧版本的主进程号

  • nginx将在不重载配置文件的情况下启动旧版的worker进程
kill -HUP 4730

centos的nginx怎么更新配置文件 nginx版本更新_nginx_26


(2)kill -WINCH 新版本的主进程号

  • 关闭新版本的worker进程,旧版本处理请求
kill -WINCH  7344

centos的nginx怎么更新配置文件 nginx版本更新_热部署_27


步骤三:再查看版本号, 恢复成了旧版本

nginx -V

centos的nginx怎么更新配置文件 nginx版本更新_旧版_28


在客户端测试

curl -I 172.25.1.1

centos的nginx怎么更新配置文件 nginx版本更新_旧版_29


此时,回滚到旧版本对外提供服务