Nginx热部署详解

前言

原理:

  • nginx 支持热加载 热部署 ,在不打断用户请求的情况下更新版本
  • Nginx 只所以出名,和它内部的精密设计有关。Nginx 采用了高度模块化的设计思路,并且内部的进程主要有两类,master 进程 和 worker 进程。其中 master 进程只有一个,worker 进程可以有多个。
  • worker 进程才是真正 working 的进程,才是真正处理请求的进程。worker 进程全部都是 master 进程的子进程。worker 进程是以普通用户的身份进行运行的,这样就可以极大增加程序的安全性。就算是万一有一个进程被劫持,那也不会有管理员权限。
  • nginx 的热部署和其并发模型有着密不可分的关系。说白了,就是因为 master 进程的关系。当通知 ngnix 重读配置文件的时候,master 进程会进行语法错误的判断。如果存在语法错误的话,返回错误,不进行装载;如果配置文件没有语法错误,那么 ngnix 也不会将新的配置调整到所有 worker 中。而是,先不改变已经建立连接的 worker,等待 worker 将所有请求结束之后,将原先在旧的配置下启动的 worker 杀死,然后使用新的配置创建新的 worker。

实验环境:

  • rhel7.3版本的虚拟机
  • 两个不同版本的nginx安装包

一、配置过程

1.下载两个不同版本的安装包

[root@server1 ~]# ls
nginx-1.15.9.tar.gz  nginx-1.16.0.tar.gz

Nginx热部署详解_第1张图片

配置一个1.16.0版本的nginx

2.解压1.16.0版本,作为旧的版本

[root@server1 ~]# tar zxf nginx-1.16.0.tar.gz
[root@server1 ~]# ls
nginx-1.15.9.tar.gz  nginx-1.16.0  nginx-1.16.0.tar.gz

Nginx热部署详解_第2张图片
3.关闭debug日志,编译,安装

Nginx热部署详解_第3张图片
解压出来的源码安装包下的文件的解释
Nginx热部署详解_第4张图片
.
(1)关闭debug日志

[root@server1 nginx-1.16.0]# vim auto/cc/gcc					##关闭日志

在这里插入图片描述(2)安装依赖性

[root@server1 nginx-1.16.0]# yum install -y pcre-devel zlib-devel gcc

Nginx热部署详解_第5张图片

(3)编译

[root@server1 nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --with-file-aio

Nginx热部署详解_第6张图片

(4)编译之后出现了objs目录

Nginx热部署详解_第7张图片

(5)安装

[root@server1 nginx-1.16.0]# make 

Nginx热部署详解_第8张图片

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

[root@server1 nginx-1.16.0]# ls
[root@server1 nginx-1.16.0]# cd objs/
[root@server1 objs]# ls

Nginx热部署详解_第9张图片
(6)make install

[root@server1 nginx-1.16.0]# make install

Nginx热部署详解_第10张图片

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

4.配置nginx服务

(1)查看配置文件,第一行是nobody
不写的话nginx进程默认用户是nobody 可以开启服务用ps aux查看
Nginx热部署详解_第11张图片
Nginx热部署详解_第12张图片
(2)进行语法检测

[root@server1 conf]# ../sbin/nginx -t

Nginx热部署详解_第13张图片
(3)查看版本号

[root@server1 conf]# ../sbin/nginx -V

Nginx热部署详解_第14张图片
(4)打开服务

[root@server1 conf]# ../sbin/nginx 

Nginx热部署详解_第15张图片

(5)查看进程所有人是nobody

[root@server1 conf]# ps aux | grep nginx

Nginx热部署详解_第16张图片

(6)创建nginx用户

[root@server1 conf]# useradd nginx
[root@server1 conf]# id nginx
uid=1000(nginx) gid=1000(nginx) groups=1000(nginx)

Nginx热部署详解_第17张图片(7)关闭之前的nginx服务

[root@server1 conf]# ../sbin/nginx -s stop

(8)编辑配置文件

[root@server1 conf]# vim nginx.conf    ##改变用户
user  nginx nginx;
worker_processes  2;

Nginx热部署详解_第18张图片

(9)先在系统安全的配置文件中设定nginx用户允许的最大文件数

[root@server1 conf]# vim /etc/security/limits.conf

在这里插入图片描述
(10)再次编辑nginx配置文件,在配置文件设置最大并发数

[root@server1 conf]# vim nginx.conf    ##改变最大并发数
 12 events {
 13     worker_connections  65535;
 14 }

Nginx热部署详解_第19张图片
(11)打开服务,查看进程,进程所有人是nginx用户

[root@server1 conf]# ../sbin/nginx 
[root@server1 conf]# 
[root@server1 conf]# ps aux

Nginx热部署详解_第20张图片

(12)打开浏览器测试,访问成功
访问到nginx的默认页面
Nginx热部署详解_第21张图片

二、更新nginx

1.解压另一个版本的nginx

[root@server1 ~]# cd nginx-1.15.9
[root@server1 nginx-1.15.9]# ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src

Nginx热部署详解_第22张图片
Nginx热部署详解_第23张图片

2.编译安装,同样关闭debug日志,不取消版本号方便观察

注意:千万不要make insatll 否则会把二进制执行文件复制到/usr/local下的nginx目录 覆盖之前的文件

(1)编译

[root@server1 nginx-1.15.9]# ./configure --prefix=/usr/local/nginx --with-file-aio

Nginx热部署详解_第24张图片
(2)同样出现objs目录

Nginx热部署详解_第25张图片

(3)安装

[root@server1 nginx-1.15.9]# make

Nginx热部署详解_第26张图片
objs目录下的文件增加

[root@server1 nginx-1.15.9]# cd objs/
[root@server1 objs]# ls

Nginx热部署详解_第27张图片

(4)备份旧版本的nginx二进制执行文件

[root@server1 objs]# cd /usr/local/nginx/sbin/
[root@server1 sbin]# ls
nginx
[root@server1 sbin]# cp nginx nginx.old
[root@server1 sbin]# ls
nginx  nginx.old

Nginx热部署详解_第28张图片

(5)替换二进制文件(将新版本的二进制执行文件覆盖过去,要加 -f 否则报错正忙)

[root@server1 objs]# cp -f  nginx /usr/local/nginx/sbin/nginx
cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y

(6)查看nginx进程,一个master,两个worker

[root@server1 objs]# ps -ef | grep nginx

Nginx热部署详解_第29张图片

(7)查看当前版本

[root@server1 objs]# cd -
/usr/local/nginx/sbin
[root@server1 sbin]# ./nginx -V

Nginx热部署详解_第30张图片

注意:虽然当前版本已经变成了1.15.9版本,这个时候表面上看起来是更新成了新版本,但还是旧版本的在工作,接收客户端请求的仍然是1.16.0版本的nginx,这就有了下面的平滑升级

三、平滑升级

1.kill -USR2 旧版本的主进程号 (让旧版本的worker进程不再接受请求)
在这里插入图片描述

[root@server1 objs]# kill -USR2 4810
[root@server1 objs]# ps -ef | grep nginx

Nginx热部署详解_第31张图片
可以看到现在有2个master,4个worker

2.kill -WINCH 旧版本的主进程号 (关闭旧版本的worker进程)

[root@server1 objs]# kill -WINCH 4810
[root@server1 objs]# ps -ef | grep nginx

Nginx热部署详解_第32张图片

可以看到现在有2个master,2个worker
旧版本的worker被关闭

3.查看版本号现在用的是新版本

Nginx热部署详解_第33张图片

四、版本的回退(如果升级后有问题可以立即回退来恢复)

命令 作用
kill -USER2 进程号 不再让worker进程接受请求,当前请求处理完就让worker进程退出
kill -WINCH 进程号 处理完关闭
kill -HUP 进程号 启动进程

1.先将二进制执行文件还原,不加-f会提示文件正忙

操作前的进程nginx情况
Nginx热部署详解_第34张图片
开始回退

[root@server1 objs]# cd /usr/local/nginx/sbin/
[root@server1 sbin]# ls
nginx  nginx.old
[root@server1 sbin]# cp nginx.old nginx
cp: overwrite ‘nginx’? y
cp: cannot create regular file ‘nginx’: Text file busy

[root@server1 sbin]# 
[root@server1 sbin]# cp -f nginx.old nginx
cp: overwrite ‘nginx’? y

Nginx热部署详解_第35张图片

2.现在依旧是2个master 2个worker

Nginx热部署详解_第36张图片

3.kill -HUP 旧版本的进程号 (拉起旧版本的worker进程)

[root@server1 sbin]# kill -HUP 4810
[root@server1 sbin]# ps -ef | grep nginx

2个master 4个worker

Nginx热部署详解_第37张图片

5.kill -WINCH 新版本的主进程号 (关闭新版本的worker进程)

[root@server1 sbin]# kill -WINCH 16940
[root@server1 sbin]# ps -ef | grep nginx

Nginx热部署详解_第38张图片

6.查看版本号,是旧版本的nginx

[root@server1 sbin]# /usr/local/nginx/sbin/nginx -V

Nginx热部署详解_第39张图片

你可能感兴趣的:(运维企业部分)