目录
一、I/O模型概述
1、I/O概念
1.1 计算机的I/O
1.2 Linux的I/O
2、零拷贝技术
3、同步/异步(消息反馈机制)
4、阻塞/非阻塞
5、网络I/O模型
5.1 阻塞型 I/O 模型(blocking IO)
5.2 非阻塞型 I/O 模型 (nonblocking IO)
5.3 多路复用 I/O 型 ( I/O multiplexing )
5.4 信号驱动式 I/O 模型
5.5 异步 I/O 模型 (asynchronous IO)
二、nginx介绍
1、nginx概述
1.1 nginx概念
1.2 nginx特性
1.3 nginx工作原理
1.4 nginx优缺点
2、nginx事件驱动模型
2.1 select
2.2 poll
2.3 epoll
2.4 nginx支持高并发
3、nginx的两种进程
4、nginx模块
5、nginx和Apache的区别
三、安装nginx
1、yum部署
1.1 yum安装nginx
1.2 yum安装nginx的配置文件
2、编译安装nginx
2.1 编译安装nginx过程
2.2 启动停止nginx
2.3 创建nginx自启动文件
3、nginx安装包文件详解
四、nginx命令详解
1、nginx基础命令语法
2、nginx信号与reopen分割日志
2.1 nginx信号
2.2 reopen分割日志
五、热升级(nginx/1.18-->nginx/1.20)
1、热升级的概念
2、nginx热升级具体步骤
3、从当前版本回滚到之前版本
一、I/O模型概述
1、I/O概念
1.1 计算机的I/O
I/O在计算机中指Input/Output, IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请求通常为读或写数据操作请求。
一次完整的I/O是用户空间的进程数据与内核空间的内核数据的报文的完整交换,但是由于内核空间与用户空间是严格隔离的,所以其数据交换过程中不能由用户空间的进程直接调用内核空间的内存数据,而是需要经历一次从内核空间中的内存数据copy到用户空间的进程内存当中,所以简单说I/O就是把数据从内核空间中的内存数据复制到用户空间中进程的内存当中
1.2 Linux的I/O
-
磁盘I/O 磁盘I/O是进程向内核发起系统调用,请求磁盘上的某个资源比如是html 文件或者图片,然后内核通过相应的驱动程序将目标文件加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间
-
网络I/O : Linux一切皆文件,本质为对socket文件的读写 网络通信就是网络协议栈到用户空间进程的IO就是网络IO
2、零拷贝技术
零拷贝(Zero Copy)技术是一种优化计算机系统性能的技朮,它的主要目标是减少数据在内存和磁盘之间的复制次数,从而减少 CPU 的使用率和 I/O 操作的延迟
为什么需要零拷贝技术:
因为在传统的 I/O 操作中,数据通常需要经过多次复制才能从一个地方移动到另一个地方。例如,当一个应用程序从磁盘读取数据时,数据首先会被复制到内核的缓冲区,然后再被复制到应用程序的用户空间。这种复制操作会消耗大量的CPU时间和内存带宽
为解决问题,就产生了零拷贝技术:
零拷贝技术通过减少或消除这些复制操作来提高系统的性能。例如,当一个应用程序从磁盘读取数据时,数据可以直接从磁盘读取到应用程序的用户空间,而不需要经过内核的缓冲区。同样,当一个应用程序向网络发送数据时,数据可以直接从应用程序的用户空间发送,而不需要经过内核的缓冲区
3、同步/异步(消息反馈机制)
关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知
-
同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成
-
异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态
4、阻塞/非阻塞
关注调用者在等待结果返回之前所处的状态
-
阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情
-
非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情
5、网络I/O模型
阻塞型、非阻塞型、复用型、信号驱动型、异步
5.1 阻塞型 I/O 模型(blocking IO)
阻塞IO模型是最简单的I/O模型,用户线程在内核进行IO操作时被阻塞用户线程通过系统调用read发起I/O读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read操作用户需要等待read将数据读取到buffer后,才继续处理接收的数据。整个I/O请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够
-
优点
程序简单,在阻塞等待数据期间进程/线程挂起,基本不会占用 CPU 资源
-
缺点
每个连接需要独立的进程/线程单独处理,当并发请求量大时为了维护程序,内存、线程切换开销较大,apache 的preforck使用的是这种模式
5.2 非阻塞型 I/O 模型 (nonblocking IO)
在非阻塞 I/O 模型中,当一个进程发起一个 I/O 操作(如读取文件、发送网络数据等),操作系统会立即返回一个结果,而不是等待 I/O 操作完成。如果 I/O 操作立即完成,那么结果就是 I/O 操作的结果;如果 I/O 操作没有立即完成,那么结果就是一个错误码,表示 I/O 操作还在进行
进程可以通过轮询或者事件通知等方式,不断地查询 I/O 操作的结果。如果 I/O 操作已经完成,那么进程就可以处理 I/O 操作的结果;如果 I/O 操作还在进行,那么进程就可以继续执行其他任务
- 优点
可提高系统的并发性能,因为一个进程可以在等待 I/O 操作完成的同时,继续执行其他任务
- 缺点
需要进程不断地查询 I/O 操作的结果,这可能会消耗大量的 CPU 时间
5.3 多路复用 I/O 型 ( I/O multiplexing )
一个进程可以使用一个系统调用(如 select()、poll() 或 epoll())来监视多个 I/O 事件。当一个或多个 I/O 事件准备好时,系统调用就会返回,告诉进程哪些 I/O 事件已经准备好
进程可以通过轮询或者事件通知等方式,不断地查询系统调用的结果。如果一个 I/O 事件已经准备好,那么进程就可以处理这个 I/O 事件;如果没有 I/O 事件准备好,那么进程就可以继续执行其他任务
- 优点
可以提高系统的并发性能,因为一个进程可以同时监视多个 I/O 事件
- 缺点
需要进程不断地查询系统调用的结果,这可能会消耗大量的 CPU 时间
5.4 信号驱动式 I/O 模型
在信号驱动式 I/O 模型中,一个进程可以使用一个系统调用(如 sigaction())来设置一个信号处理函数。当一个 I/O 事件准备好时,操作系统就会发送一个信号给进程,进程就会调用信号处理函数来处理这个 I/O 事件
- 优点
可以提高系统的并发性能,因为一个进程可以在 I/O 事件准备好时,立即处理这个 I/O 事件
- 缺点
需要进程设置信号处理函数,这可能会增加程序的复杂性
5.5 异步 I/O 模型 (asynchronous IO)
在异步 I/O 模型中,允许一个进程在发起 I/O 操作后,不需要等待 I/O 操作完成,就可以继续执行其他任务。当 I/O 操作完成后,操作系统会通知进程,进程就可以处理 I/O 操作的结果
在异步 I/O 模型中,一个进程可以使用一个系统调用(如 aio_read() 或 aio_write())来发起一个异步 I/O 操作。当 I/O 操作完成后,操作系统就会发送一个信号或者调用一个回调函数来通知进程
- 优点
可以提高系统的并发性能,因为一个进程可以在发起 I/O 操作后,立即处理其他任务
- 缺点
需要操作系统支持,而且可能会增加程序的复杂性
二、nginx介绍
1、nginx概述
1.1 nginx概念
Nginx(发音为"engine x")是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。Nginx 是由 Igor Sysoev 创建的,第一个公开版本发布于 2004 年。Nginx 以其高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名
1.2 nginx特性
-
高性能:Nginx 是一个事件驱动的服务器,它使用异步非阻塞 I/O 模型,可以处理大量并发连接,适合用于高负载的 Web 服务器环境
-
低资源消耗:Nginx 的内存消耗量通常比 Apache 低得多,这使得 Nginx 在资源有限的环境中表现得更好
-
反向代理:Nginx 可以作为反向代理服务器,用于负载均衡、缓存、SSL 终端、HTTP/2 和 WebSocket 等功能
-
模块化设计:Nginx 的设计是模块化的,可以通过加载不同的模块来扩展其功能,例如 gzip 压缩、SSL 加密、URL 重写、访问控制等
-
简单的配置:Nginx 的配置文件使用简单的文本格式,易于理解和修改
-
支持热部署:Nginx 支持热部署,可以在不中断服务的情况下重新加载配置文件
-
支持多种平台:Nginx 可以运行在多种 Unix-like 系统上,包括 Linux、FreeBSD、Solaris、Mac OS X 和 AIX,也可以运行在 Windows 上
1.3 nginx工作原理
Nginx 的工作原理是基于事件驱动的架构。
当一个请求到达 Nginx 时,Nginx 会将其分发给一个工作进程(worker process)。这个工作进程会处理这个请求,然后将响应返回给客户端。在这个过程中,Nginx 不会阻塞,可以继续处理其他请求
1.4 nginx优缺点
- 优点
①可以跨平台,配置简单,内存消耗少,10个nginx才占用150M内存。
②使用的是epoll模型,这种模型是I/O多路复用技术(I/O多路复用是一种技术,它允许一个进程或线程监控多个网络连接,当其中某个或某几个连接有数据时,当前程序可以拿到网卡收到的数据进行下一步的处理;),异步非阻塞的模型(异步非阻塞模型可以提高程序的效率,在等待I/O操作完成的同时,可以继续执行其他代码。)
③nginx支持高并发连接,处理2-3万并发连接数,官方监测能支持5万并发。
④成本低,且开源,稳定性高,宕机概率非常小;
⑤内置的健康检查功能,可以允许在服务器宕机的时候,做健康检查,再发送的请求就不会发给宕机的服务器,会重新提交到其他节点上
- 缺点
①nginx不方便处理动态资源,可以进行动静分离,将动态请求交给后端程序去进行处理
②不支持 .htaccess 文件、不支持 HTTP/2 的所有特性、不支持 WebDAV 和 CalDAV
2、nginx事件驱动模型
nginx使用多路复用I/O模型,一个进程可以使用一个系统调用(如 select()、poll() 或 epoll())来监视多个 I/O 事件。当一个或多个 I/O 事件准备好时,系统调用就会返回,告诉进程哪些 I/O 事件已经准备好
2.1 select
一个应用程序,代理系统功能处理异步请求,最大连接数是1024个
它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长
2.2 poll
select加强版取消了1024最大连接数
poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的
2.3 epoll
poll的加强版
epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的
select | poll | epoll | |
---|---|---|---|
操作方式 | 遍历 | 遍历 | 回调 |
底层实现 | 数组 | 链表 | 哈希表 |
I/O效率 | 每次调用都进行线性遍历,时间复杂度为0(n) | 每次调用都进行线性遍历,时间复杂度为0(n) | 事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪的fd放到rdlst里,时间复杂度0(1) |
最大连接数 | 1024(x86) 2048(x64) | 无上限 | 无上限 |
fd拷贝 | 每次调用select都需要把fd集合从用户拷贝到内核态 | 每次调用select都需要把fd集合从用户拷贝到内核态 | 调用epoll_ctl时拷贝进内核并保存,之后每次epoll_wait不拷贝 |
2.4 nginx支持高并发
最核心的原因:nginx是异步,非阻塞,使用 epoll ,和并且可以进行简单的配置细节优化。
假设一个server采用一个进程(或者线程)负责一个请求的方式,那么进程的数量就是并发的数量,那么会有很多进程在等待中,等待网络的传输,非常耗时耗资源。
但是nginx是使用了异步非阻塞的程序运行方式,解决了等待浪费时间的痛点,有一个专门进行调度进程,每次有一个request请求,就可以分配给worker进程去进行处理,web server 的工作性质决定了每个 request 的大部份生命都是在网络传输中,实际上花费在 server 机器上的时间片不多。这是几个进程就解决高并发的秘密所在
3、nginx的两种进程
-
Master 进程:这是 Nginx 的主进程,它负责读取和解析配置文件,以及创建和管理工作进程。Master 进程通常只有一个,它不处理网络连接,而是通过创建多个工作进程来处理网络连接
-
Worker 进程:这是 Nginx 的工作进程,它负责处理网络连接。Worker 进程通常有多个,它们之间是独立的,每个进程都有自己的事件循环。当一个新的网络连接到达时,Master 进程会选择一个空闲的 Worker 进程,然后将这个网络连接交给这个 Worker 进程处理
这种设计使得 Nginx 能够处理大量的并发连接,而且能够充分利用多核 CPU 的性能
4、nginx模块
- 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
- 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置等
- 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
- 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
- Stream服务模块: 实现反向代理功能,包括TCP协议代理 反向
- 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
①核心模块:core module
②标准模块:
HTTP 模块: ngx_http_*
HTTP Core modules #默认功能
HTTP Optional modules #需编译时指定
Mail 模块: ngx_mail_*
Stream 模块 ngx_stream_*
③第三方模块
5、nginx和Apache的区别
- nginx是轻量级,nginx比apache 占用更少的内存及资源
- 静态处理,Nginx 静态处理性能比 Apache 高
- Nginx可以实现无缓存的反向代理加速,提高网站运行速度
- Nginx的性能和可伸缩性不依赖于硬件,Apache依赖于硬件
- Nginx支持热部署,启动速度迅速,可以在不间断服务的情况下,对软件版本或者配置进行升级
- nginx是异步进程,基于事件的web服务器,多个连接对应一个进程 ;apache是同步多进程,基于流程的web服务器,一个连接对应一个进程
- Nginx高度模块化,编写模块相对简单,且组件比Apache少
- nginx抗并发,nginx处理请求是异步非阻塞的,而Apache则是阻塞性的,在高并发下的nginx能够保持低资源,低消耗高性能
三、安装nginx
1、yum部署
1.1 yum安装nginx
①使用yum部署Nginx需要先安装epel-release扩展包,官方源默认没有Nginx的yum源
yum install epel-release -y #安装epel-release扩展源
②扩展源安装完后直接安装nginx
yum install nginx -y #安装nginx服务
1.2 yum安装nginx的配置文件
/etc/nginx.conf | 主配置文件 |
---|---|
/usr/share/nginx/html | 默认网页文件根目录 |
/var/log/nginx/ | 默认日志文件 |
2、编译安装nginx
最好使用编译安装nginx,因为yum安装的nginx模块较少,而编译安装可以添加特定的模块
2.1 编译安装nginx过程
①下载安装包
官网下载安装包,nginx官网地址:www.nginx.org,进入后找到右边菜单栏的download,进入后选择自己想要下载的版本可以直接下载到本地,然后传到Linux系统中或右键复制该包的下载连接在Linux系统中wget此地址直接下载到Linux系统中
[root@localhost ~]#cd /data #切换到想要的目录下载安装包
[root@localhost data]#wget http://nginx.org/download/nginx-1.18.0.tar.gz
② 安装包下载完成后解压到当前目录,并安装编译需要的依赖环境和工具,再新建nginx用户便于管理
[root@localhost data]#tar xf nginx-1.18.0.tar.gz #解压源码包
[root@localhost nginx-1.18.0]#cd nginx-1.18.0/ #切换目录
#下载安装所需编译工具
[root@localhost nginx-1.18.0]#yum -y install gcc gcc-c++ pcre-devel openssl-devel zlib-devel openss1 openss1-deve1
#新建nginx用户便于管理
[root@localhost nginx-1.18.0]#useradd -M -s /sbin/nologin nginx
③编译安装三步骤(./configure、make、make install)
#执行脚本,指定安装位置、指定用户为nginx用户、指定组为nginx组、指定安装的模块
[root@localhost nginx-1.18.0]#./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module#将所有源代码翻译成二进制,形成一个可执行文件
[root@localhost nginx-1.18.0]#make -j2
#将执行文件及相关的依赖文件拷贝到指定目录中
[root@localhost nginx-1.18.0]#make install
④修改权限
[root@localhost ~]#chown -R nginx.nginx /apps/nginx
⑤创建软链接,便于tab键补全
[root@localhost ~]#ln -s /apps/nginx/sbin/nginx /usr/bin
⑥设置配置文件关键词高亮
[root@localhost ~]#cp -r /data/nginx-1.18.0/contrib/vim/* /usr/share/vim/vimfiles/
2.2 启动停止nginx
#启动
[root@localhost ~]#/apps/nginx/sbin/nginx #绝对路径启动
或者
[root@localhost ~]#nginx #创建软连接后直接启动
[root@localhost ~]#ps aux |grep nginx #通过查看是否有nginx进程反映nginx是否开启
#停止
[root@localhost ~]#killall nginx
2.3 创建nginx自启动文件
[root@localhost ~]#vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf #注意启动文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target[root@localhost ~]#systemctl daemon-reload #重新加载配置
[root@localhost ~]#systemctl enable --now nginx #开机自启并立即启动
3、nginx安装包文件详解
- contrib:存放vim格式文件,可以修改nginx配置文件的格式
- conf:存放配置文件
- man:存放man帮助文件
#查看man帮助
[root@localhost man]#man /data/nginx-1.18.0/man/nginx.8
- src:源码包,用于存放nginx软件的源代码文件
#用于统计共有多少源代码文件
[root@localhost nginx-1.18.0]#find src -type f |xargs cat |wc -l
- html:目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web文件是默认的错误页面提示页面
- logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比如/var/logs/nginx里面
- sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能
四、nginx命令详解
1、nginx基础命令语法
#帮助
[root@localhost ~]#nginx -h
#格式
nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
选项 | 说明 |
---|---|
-v | 显示当前系统nginx版本 |
-V | 显示nginx编译详细情况、模块等信息 |
-s | 发信号 -s stop 立即关闭nginx -s quit 优雅退出 ,不影响业务的状态下退出 -s reload 重新加载 |
-g | 指定配置,不已配置文件中的为准 |
-t | 检查语法格式 |
-T | 检测配置文件是否有语法错误,转储 |
-p prefix | 设置前缀路径(默认是:/etc/nginx/) |
-e filename | 错误日志文件(默认是/var/log/nginx/error.log) |
-c filename | 设置配置文件(默认是:/etc/nginx/nginx.conf) |
-q | 在检测配置文件期间屏蔽非错误信息 |
显示版本信息:
[root@localhost ~]#nginx -v
显示编译详细信息模块等信息:
[root@localhost ~]#nginx -V
检查语法错误:
[root@localhost ~]#nginx -t
2、nginx信号与reopen分割日志
2.1 nginx信号
[root@localhost ~]#kill -l #查看信号
nginx的信号:
①quit信号 -----SIGTERM,直接停止,不等服务执行完,nginx -s quit或kill -TERM执行
②stop信号-----SIGQUIT,优雅的退出,等所有服务执行完再退出,nginx -s stop 或kill -QUIT执行
③reopen信号---SIGUSER1 分隔日志
创建新的nginx日志时需要发送USER1信号给nginx主进程才可以生效。kill -USER1 nginx主进程pid号。
④SIGUSER2信号,优雅的升级,不影响正在使用的用户,kill -USER2执行。
⑤reload信号----SIGHUP,重新加载配置文件,nginx -s reload或kill -HUP执行。
2.2 reopen分割日志
客户端每次访问服务器,服务器都会产生相应的日志内容在access.log文件
现在如何分割日志呢?
方法一:
#nginx服务器操作
[root@localhost logs]#mv access.log access.log.bak1
[root@localhost logs]#touch access.log
#重新打开日志文件,否则依然写入.bak
[root@localhost logs]#nginx -s reopen
方法二:
#nginx服务器操作
[root@localhost logs]#mv access.log access.log.bak2
[root@localhost logs]#touch access.log
#重新打开日志文件,否则依然写入.bak
[root@localhost logs]#pstree -p | grep nginx
[root@localhost logs]#kill -s USR1 1723
区别:
[root@localhost logs]#nginx -s reopen #使用nginx命令不需要跟主进程的pid
[root@localhost logs]#kill -s USR1 1723 #使用kill命令需要跟主进程的pid
五、热升级(nginx/1.18-->nginx/1.20)
1、热升级的概念
热升级指的是在系统运行过程中对软件或系统进行升级操作,而不需要停止当前正在执行的服务或进程。这意味着在进行升级时,系统可以继续提供服务,对用户来说基本无感知
nginx热升级过程:
①将旧Nginx文件换成新Nginx文件(注意备份)
②向master进程发送USR2信号
③master进程修改pid文件名,加后缀.oldbin
④master进程用新Nginx文件启动新master进程,系统中将有新旧两个Nginx主进程共同提供Web服务
⑤向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止,并删除Nginx.pid.oldbin文件
⑥向旧master进程发送QUIT信号,关闭老master
⑦如果发现升级有问题,可以回滚向老master发送HUP,向新master发送QUIT
2、nginx热升级具体步骤
①下载nginx/1.20的安装包并解压
[root@localhost logs]#cd /data
[root@localhost data]#wget https://nginx.org/download/nginx-1.20.2.tar.gz
[root@localhost data]#tar xf nginx-1.20.2.tar.gz
[root@localhost data]#cd nginx-1.20.2/
②安装模块
[root@localhost nginx-1.20.2]#./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
③编译,但不需要安装
[root@localhost nginx-1.20.2]#make
④查看nginx版本
[root@localhost nginx-1.20.2]#cd objs/
[root@localhost objs]#nginx -v
[root@localhost objs]#./nginx -v
⑤备份旧版本的nginx
[root@localhost objs]#cd /apps/nginx/sbin/
[root@localhost sbin]#mv nginx nginx.bak
[root@localhost sbin]#cp /data/nginx-1.20.2/objs/nginx .
[root@localhost sbin]#ls
⑥升级
[root@localhost sbin]#pstree -p | grep nginx
[root@localhost sbin]#kill -USR2 1723
[root@localhost sbin]#pstree -p | grep nginx
[root@localhost sbin]#ps -aux|grep -v grep|grep nginx
⑦优雅的退出旧版本(不影响正在使用的客户端)
测试:先用客户端下载服务器的资源,当服务器退出旧版本更新新版本后,查看现在客户端下载是否中断
#服务器操作
#先生成大文件来方便客户端下载
[root@localhost sbin]#dd if=/dev/zero of=/apps/nginx/html/m.img bs=1G count=10
#客户端操作
[root@localhost ~]#wget --limit-rate=1M http://172.16.12.10/m.img
#服务器操作
[root@localhost sbin]#ss -ntap|grep 80
[root@localhost sbin]#kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`
[root@localhost sbin]#ss -ntap|grep 80
#客户端操作
[root@localhost ~]#curl -I 172.16.12.10
⑧kill旧进程
3、从当前版本回滚到之前版本
前提:在旧版本的master还在的情况下
如果不在就先唤醒旧的进程,再进行操作
#唤醒旧进程
[root@localhost sbin]#kill -HUP `cat /apps/nginx/logs/nginx.pid.oldbin`
[root@localhost ~]#cd /apps/nginx/sbin/
[root@localhost sbin]#mv nginx nginx.1.20
[root@localhost sbin]#mv nginx.bak nginx
[root@localhost sbin]#systemctl restart nginx.service