NGINX相关介绍其一

HTTP协议和NGINX

跨网络的主机间通讯 远程的两台主机联系在一起

套接字Socket是进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间进行通信和数据交换,SocketAPI出现于1983年 BSD 4.2实现在建立通信连接的每一端,进程间的传输要有两个标志:IP地址和端口号,合称为套接字地址 socket address

  • 客户机套接字地址定义了一个唯一的客户进程

  • 服务器套接字地址定义了一个唯一的服务器进程

套接字相关的系统调用:

  • socket() 创建一个套接字

  • bind() 绑定IP和端口

  • listen() 监听

  • accept() 接收请求

  • connect() 请求连接建立

  • write() 发送

  • read() 接收

  • close() 关闭连接

我们可以使用 nc工具来模拟实验

 [root@localhost ~]#nc -l 9527
 #监听9527
 [root@localhost ~]#ss -ntlp
 #正在监听端口
 LISTEN     0      10                *:9527
 ​
 ​
 使用第二太机器测试
 [root@localhost ~]#nc 192.168.91.100 9527
 hello

HTTP超文本传输协议

HTTP相关概念

互联网:是网络,是所有类型网络的母集。

因特网:世界上最大的互联网网络。即因特网概念从属于互联网概念。习惯上,大家把连接在因特网上的计算机都成为主机。

万维网:WWW(world wide web)万维网并非某种特殊的计算机网络,是一个大规模的、联机式的信息贮藏库,使用链接的方法能非常方便地从因特网上的一个站点访问另一个站点(超链技术),具有提供分布式服务的特点。万维网是一个分布式的超媒体系统,是超文本系统的扩充,基于B/S架构实现

URL:万维网使用统一资源定位符(Uniform Resource Locator)来标志万维网上的各种文档,并使每个文档在整个因特网的范围内具有唯一的标识符URL。

HTTP:为解决"用什么样的网络协议来实现整个因特网上的万维网文档”这一难题,就要使万维网客户程序(以浏览器为主,但不限于浏览器)与万维网服务器程序之间的交互遵守严格的协议,即超文本传送协议(HyperText Transfer Protocol)。HTTP是处于应用层的协议,使用TCP传输层协议进行可靠的传送。因此,需要特别提醒的是,万维网是基于因特网的一种广泛因特网应用系统,且万维网采用的是HTTP(80/TCP)和 HTTPS(443/TCP)的传输协议,但因特网还有其他的网络应用系统(如:FTP、SMTP等等)。

HTML:为了解决"怎样使不同作者创作的不同风格的万维网文档,都能在因特网上的各种主机上显示出来,同时使用户清楚地知道在什么地方存在着链接”这一问题,万维网使用超文本标记语言(HyperText Markup Language),使得万维网页面的设计者可以很方便地用链接从页面的某处链接到因特网的任何一个万维网页面,并且能够在自己的主机品目上将这些页面显示出来。HTML与txt一样,仅仅是是一种文档,不同之处在于,这种文档专供于浏览器上为浏览器用户提供统一的界面呈现的统一规约。且具备结构化的特征,这是txt所不具备的强制规定。

浏览器访问网站的过程

image-20230823181926777

IO模型

I/O就是把数据从内核空间中的内存数据复制到用户空间中进程的内存当中。

原因(不同空间不互通,多一步复制数据):

一次完整的I/O是用户空间的进程数据与内核空间的内核数据的报文的完整交换,但是由于内核空间与用户空间是严格隔离的,所以其数据交换过程中不能由用户空间的进程直接调用内核空间的内存数据,而是需要经历一次从内核空间中的内存数据copy到用户空间的进程内存当中的。

 1.客户端发起请求 先发送到网卡   
 2.网卡收到的报文复制到内核空间
 3.内核空间再复制到用户空间的应用程序空间
 4.nginx 分析得到一个磁盘页面文件
 5.再将需求反馈给内核空间,因为应用程序没有权限从磁盘上直接读取文件,需要依靠内核
 6.内核去磁盘上找到所需要的文件,加载到内核空间
 7.加载后再复制到用户空间
 8.用户空间构建响应报文,交给内核空间,内核空间再复制给网卡,返回给用户
 整个过程会来回切换 用户空间,内核空间  那么我们可以再次基础上做优化处理

 

 

前提)当用户发起http请求,需要请求一个index.html文件

1)客户端请求与服务端建立连接,建立连接后,会发送请求报文(建立连接)

2)服务端的网卡收到请求报文,会将该报文复制到内核空间,内核空间分析报文后交给对应程序(访问端口号)(接受请求)

3)nginx分析该报文,将报文和自己的配置文件一一比对,按照配置文件完成请求,分析后发现客户需要index.html(处理请求)

——由于程序的权限问题,没有资格直接调用磁盘上的文件

4)程序会再将这个请求再次转发给内核

5)内核得到请求后去磁盘上找文件,找到文件后复制给程序

6)程序会构建响应报文,构建好后再交给内核空间(构建响应报文)

7)内核空间得到响应报文后,再交给网卡发给客户(发送响应报文)

1、I/O模型相关概念

消息反馈机制:关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知

  • 同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成

  • 异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态

image-20230823185947006

阻塞\非阻塞:关注调用者在等待结果返回之前的状态

  • 阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情

  • 非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情

image-20230823190710625

2、网络I/O模型

阻塞型、非阻塞型、复用型、信号驱动型、异步

2.1 阻塞型I/O模型(blocking IO)

阻塞IO模型是最简单的I/O模型,用户线程在内核进行IO操作时被阻塞用户线程通过系统调用read发起I/O读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read操作用户需要等待read将数据读取到buffer后,才继续处理接收的数据。整个I/O请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够

  • 优点:程序简单,在阻塞等待数据期间进程/线程挂起,基本不会占用 CPU 资源

  • 缺点:每个连接需要独立的进程/线程单独处理,当并发请求量大时为了维护程序,内存、线程切换开销较大,apache 的preforck使用的是这种模式

 同步阻塞:程序向内核发送I/O请求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回,则进程将一直等待并不再接受新的请求,并由进程轮训查看I/O是否完成,完成后进程将I/O结果返回给Client,在IO没有返回期间进程不能接受其他客户的请求,而且是有进程自己去查看I/O是否完成,这种方式简单,但是比较慢,用的比较少。

2.2 非阻塞型I/O模型(nonblocking IO)

用户线程发起IO请求时立即返回。但并未读取到任何数据,用户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,继续执行。即 “轮询”机制存在两个问题:如果有大量文件描述符都要等,那么就得一个一个的read。这会带来大量的Context Switch(read是系统调用,每调用一次就得在用户态和核心态切换一次)。轮询的时间不好把握。这里是要猜多久之后数据才能到。等待时间设的太长,程序响应延迟就过大;设的太短,就会造成过于频繁的重试,干耗CPU而已,是比较浪费CPU的方式,一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性。

 非阻塞:程序向内核发送请I/O求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回IO结果,进程将不再等待,而且继续处理其他请求,但是仍然需要进程隔一段时间就要查看内核I/O是否完成。

2.3 多路复用I/O模型(signal-driven IO)

I/O multiplexing 主要包括:selectpollepoll三种系统调用,select/poll/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select/poll/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。Apache prefork是此模式的select,work是poll模式。

select:需要遍历,处理进度,占用资源,慢

epoll:拥有回调机制,处理好的请求自动反馈,无需遍历,没有请求上限

2.4 信号驱动式I/O模型(signal-driven IO)

信号驱动I/O的意思就是我们现在不用傻等着了,也不用去轮询。而是让内核在数据就绪时,发送信号通知我们。

调用的步骤是,通过系统调用 sigaction ,并注册一个信号处理的回调函数,该调用会立即返回,然后主程序可以继续向下执行,当有I/O操作准备就绪,即内核数据就绪时,内核会为该进程产生一个SIGIO 信号,并回调注册的信号回调函数,这样就可以在信号回调函数中系统调用 recvfrom 获取数据,将用户进程所需要的数据从内核空间拷贝到用户空间

此模型的优势在于等待数据报到达期间进程不被阻塞。用户主程序可以继续执行,只要等待来自信号处理函数的通知。

在信号驱动式 I/O 模型中,应用程序使用套接口进行信号驱动 I/O,并安装一个信号处理函数,进程继续运行并不阻塞

当数据准备好时,进程会收到一个 SIGIO 信号,可以在信号处理函数中调用 I/O 操作函数处理数据。

  • 优点:线程并没有在等待数据时被阻塞,内核直接返回调用接收信号,不影响进程继续处理其他请求因此可以提高资源的利用率

  • 缺点:信号 I/O 在大量 IO 操作时可能会因为信号队列溢出导致没法通知

异步非阻塞

2.5 异步 I/O模型(asynchronous IO)

异步I/O 与 信号驱动I/O最大区别在于,信号驱动是内核通知我们何时开始一个I/O操作,而异步I/O是由内核通知我们I/O操作何时完成,两者有本质区别,相当于不用去饭店场吃饭,直接点个外卖,把等待上菜的时间也给省了。所有事情都交给内核处理。

 

 

总结:

这五种 I/O 模型中,越往后,阻塞越少,理论上效率也是最优前四种属于同步 I/O,因为其中真正的I/O 操作(recvfrom)将阻塞进程/线程,只有异步 I/O 模型才与 POSIX 定义的异步 I/O 相匹配

Nginx支持在多种不同的操作系统实现不同的事件驱动模型,但是其在不同的操作系统甚至是不同的系统版本上面的实现方式不尽相同,主要有以下实现方式:

  select poll epoll
操作方式 遍历 遍历 回调
底层实现 数组 链表 哈希表
IO效率 每次调用都进行线性遍历,时间复杂度为O(n) 同左 事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪的fd放到rdll list里,时间复杂度为O(1)
最大连接数 1024(x86)2048(x64) 无上限 无上限
fd拷贝 每次调用select都需要把fd集合从用户拷贝到内核态 每次调用poll,都需要把fd集合从用户态拷贝到内核态 调用epoll_ctl时拷贝进内核并保存,之后每次epoll_wait不拷贝

 

 Select:
 POSIX所规定,目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,本质上是通过设置或者
 检查存放fd标志位的数据结构来进行下一步处理
 缺点
 单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义
 FD_SETSIZE,再重新编译内核实现,但是这样也会造成效率的降低
 单个进程可监视的fd数量被限制,默认是1024,修改此值需要重新编译内核
 对socket是线性扫描,即采用轮询的方法,效率较低
 select 采取了内存拷贝方法来实现内核将 FD 消息通知给用户空间,这样一个用来存放大量fd的数据结
 构,这样会使得用户空间和内核空间在传递该结构时复制开销大

 

 poll:
 本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态
 其没有最大连接数的限制,原因是它是基于链表来存储的
 大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义
 poll特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd 
 select是边缘触发即只通知一次

 

 epoll:
 在Linux 2.6内核中提出的select和poll的增强版本
 支持水平触发LT和边缘触发ET,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会
 通知一次
 使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调
 机制来激活该fd,epoll_wait便可以收到通知
 优点:
 没有最大并发连接的限制:能打开的FD的上限远大于1024(1G的内存能监听约10万个端口),具体查
 看/proc/sys/fs/file-max,此值和系统内存大小相关
 效率提升:非轮询的方式,不会随着FD数目的增加而效率下降;只有活跃可用的FD才会调用callback函数,
 即epoll最大的优点就在于它只管理“活跃”的连接,而跟连接总数无关
 内存拷贝,利用mmap(Memory Mapping)加速与内核空间的消息传递;即epoll使用mmap减少复制开销

 

NGINX概述

有两种:社区版、商业版;稳定版本:n.2n.n

Nginx功能介绍

  • 静态的web资源服务器html,图片,js,css,txt等静态资源

  • http/https协议的反向代理,7层(url)

  • 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求

  • tcp/udp协议的请求转发(反向代理)4层(传输协议、端口号、IP地址)

基础特性

  • 模块化设计,较好的扩展性(模块一编译好就一直启用)

  • 高可靠性

  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件

  • 低内存消耗:一万个keep-alive连接模式(长连接)下的非活动连接,仅需2.5M内存

  • event-driven,aio(异步),mmap(零拷贝),sendfile(零拷贝)

web服务相关的功能

  • 虚拟主机(server)

  • 支持长连接和管道连接(利用一个连接做多次请求)

  • 访问日志(支持基于日志缓冲提高性能)

  • url rewrite(访问地址跳转)

  • 路径别名(alias)

  • 基于IP及用户的访问控制

  • 支持速率限制及并发数限制

  • 重新配置和在线升级而无需终端客户的工作进程

两服务器(apache、nginx)区别

特性 Apache Nginx
模块化 模块功能可手动自选开启关闭 编译安装好就一直启用模块功能
  系统调用选择select,需要遍历 系统调用选择epoll,有回调机制
  擅长处理动态文件 处理静态文件好
  抗压能力弱 支持高并发
  rewrite功能强大  

共通性:

都可做下载服务器使用

Nginx架构

Nginx 进程结构

web请求处理机制

  • 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求。

  • 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来个客户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。

主进程(master process)的功能:

 对外接口:接收外部的操作(信号)
 对内转发:根据外部的操作的不同,通过信号管理 Worker
 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
 读取Nginx 配置文件并验证其有效性和正确性
 建立、绑定和关闭socket连接
 按照配置生成、管理和结束工作进程
 接受外界指令,比如重启、升级及退出服务器等指令
 不中断服务,实现平滑升级,重启服务并应用新的配置
 开启日志文件,获取文件描述符
 不中断服务,实现平滑升级,升级失败进行回滚处理
 编译和处理perl脚本

工作进程(worker process)的功能:

所有 Worker 进程都是平等的
实际处理:网络请求,由 Worker 进程处理
Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源,
增加上下文切换的损耗
接受处理客户的请求
将请求依次送入各个功能模块进行处理
I/O调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等

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_*
第三方模块

安装以及使用nginx

1、编译安装nginx

yum -y install gcc pcre-devel openssl-devel zlib-devel openssl  openssl-devel
#安装依赖包  
useradd -M -s /sbin/nologin nginx
#新建nginx用户便于管理#-M 不创建主目录 -s /sbin/nologin不允许登录
cd /opt/
wget http://nginx.org/download/nginx-1.18.0.tar.gz
#官网下载安装包
tar xf nginx-1.18.0.tar.gz 
cd nginx-1.18.0/
#解压软件包
mkdir /apps/nginx -p

 

./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

make    
make install

 

[root@31yml nginx-1.18.0]#chown -R nginx:nginx /apps/nginx/
#修改权限
[root@31yml nginx-1.18.0]#ll /apps/nginx/
总用量 4
drwxr-xr-x. 2 nginx nginx 4096 824 17:05 conf
drwxr-xr-x. 2 nginx nginx   40 824 17:05 html
drwxr-xr-x. 2 nginx nginx    6 824 17:05 logs
drwxr-xr-x. 2 nginx nginx   19 824 17:05 sbin


######安装好后生成四个文件功能如下
  1. conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params两个文件,配置文件一般都有个样板配置文件,是文件名.default结尾,使用的使用将其复制为并将default去掉即可。

  2. html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web文件是默认的错误页面提示页面。

  3. logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比如/var/logs/nginx里面。

  4. sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能。

1.1启动停止Nginx

##########启动##############
/apps/nginx/sbin/nginx
#绝对路径启动

ln -s /apps/nginx/sbin/nginx /usr/sbin/
#创建软连接后直接 nginx启动

##########停止###############
killall  nginx

1.2 创建Nginx自启动文件

#复制同一版本的nginx的yum安装生成的service文件

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
[Install]
WantedBy=multi-user.target

###如果需要修改pid文件可以执行以下操作#################
mkdir /apps/nginx/run/
#创建目录
vim /apps/nginx/conf/nginx.conf
#修改配置文件
pid   /apps/nginx/run/nginx.pid;
#找到 pid的位置修改  
#######################################################

systemctl daemon-reload 
#重新加载配置
systemctl enable --now nginx
#开机自启并立即启动    如果卡主是应为logs下有 nginx.pid  文件  删除即可
#我倒是没有找到/apps/nginx/logs/nginx.pid,所以直接不更改pid文件位置,直接默认
chown -R nginx.nginx /apps/nginx
#修改权限

2、yum安装

centos7 需要安装epel源
yum install -y epel-release
#安装epel源
yum install nginx -y


去使用官方源按装较新的版本
http://nginx.org/en/linux_packages.html#RHEL

3.平滑升级及信号使用

3.1信号

nginx 命令支持向其发送信号,实现不同功能

nginx 当做单独命令使用有以下选项

[root@31yml logs]#nginx -h
nginx version: nginx/1.18.0
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help#-?帮助
  -v            : show version and exit#-v\显示版本
  -V            : show version and configure options then exit#-V\查看详细下载配置内容
  -t            : test configuration and exit#-t\配置文件是否正确
  -T            : test configuration, dump it and exit#-T打印配置文件
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload#-s发送信号
  -p prefix     : set prefix path (default: /apps/nginx/)#-p指明家目录路径
  -c filename   : set configuration file (default: conf/nginx.conf)#指明加载配置文件
  -g directives : set global directives out of configuration file#使用指定配置

3.1.1 显示版本

[root@31yml logs]#nginx -v
nginx version: nginx/1.18.0

3.1.2 显示编译详细情况 模块等信息

[root@31yml logs]#nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --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

3.1.3 发送信号

kill -l  看信号大全
nginx -h   中可以看到的信号较少
s signal     : send signal to a master process: stop, quit, reopen, reload

可以使用man手册来查看详细的信号 如果没安装,去源码包里找到man文件
man   路径/nginx.8      不加路径打不开man帮助
stop      	SIGTERM        直接停止
quit       	SIGQUIT        优雅的退出:有人在访问不会结束进程
reopen   	SIGUSR1        分割日志
reload   	SIGHUP         重新加载配置文件
			SIGHUP           Reload configuration, start the new worker process with a new configuration, and
                             gracefully shut down old worker processes.
     		SIGQUIT          Shut down gracefully.  优雅的关闭:有人在访问不会结束进程
     		SIGUSR1          Reopen log files.       重新分割日志
     		SIGUSR2          Upgrade the nginx executable on the fly.  运行中升级
     		SIGWINCH         Shut down worker processes gracefully.    优雅的关闭worker进程,work进程负责处理请求,还有请求不会关闭

例子

nginx -s   stop   #立即关闭nginx
nginx -s   quit   #优雅退出   不影响业务的状态下退出
nginx -s   reload #重新加载  

分割日志

[root@31yml ~]#cd /apps/nginx/logs
#切换到日志存放位置
我的地址在配置在安装时更改过,默认在/var/log/下
[root@31yml logs]#mv access.log access.log.bak
[root@31yml logs]#touch access.log

#此时日志不会写入到新文件

需要给master 进程发送  USR1信号
[root@31yml logs]#ps aux |grep nginx
root      49128  0.0  0.0  46204  1168 ?        Ss   14:28   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx     49129  0.0  0.1  48736  2244 ?        S    14:28   0:00 nginx: worker process
root      49527  0.0  0.0 112824   988 pts/0    S+   14:56   0:00 grep --color=auto nginx

#输入命令
[root@node2 nginx]#kill -s  USR1 49128
或者
[root@node2 nginx]#nginx -s Reopen

image-20230825145840372

我用二号机再访问,这时新日志就导入“access.log”文件了,看成创建了新连接,这就形成了分割的作用,另外“access.log”这个文件名是默认格式,没有该文件时会自动创建。

image-20230825150139616

image-20230825150219287

 

 

 

平滑升级

 

#开启 两核
[root@31yml logs]#vim /apps/nginx/conf/nginx.conf
#user  nobody;
worker_processes  2;
#worker_processes  1 原来是1核

[root@31yml logs]#ps aux|grep nginx
root      49128  0.0  0.0  46204  1352 ?        Ss   14:28   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx     49129  0.0  0.1  48736  2244 ?        S    14:28   0:00 nginx: worker process
root      50014  0.0  0.0 112824   988 pts/0    S+   15:23   0:00 grep --color=auto nginx

#重新加载配置文件
[root@31yml logs]#nginx -s reload

[root@31yml logs]#ps aux|grep nginx
root      49128  0.0  0.1  46344  2032 ?        Ss   14:28   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx     50027  0.0  0.1  48856  2124 ?        S    15:23   0:00 nginx: worker process
nginx     50029  0.0  0.1  48856  2124 ?        S    15:23   0:00 nginx: worker process
root      50033  0.0  0.0 112824   988 pts/0    S+   15:23   0:00 grep --color=auto nginx

1、下载新文件

[root@localhost ~]#wget https://nginx.org/download/nginx-1.20.2.tar.gz -P /usr/local/src/
#下载安装包到src目录
[root@localhost src]#ls
nginx-1.20.2.tar.gz
[root@localhost src]#tar xf nginx-1.20.2.tar.gz 
[root@localhost src]#cd nginx-1.20.2/
[root@localhost nginx-1.20.2]#ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  

解压

#cd /usr/local/src/
[root@31yml src]#ls
nginx-1.20.2.tar.gz
[root@31yml src]#tar xf nginx-1.20.2.tar.gz 
[root@31yml src]#cd ./nginx-1.20.2/
[root@31yml nginx-1.20.2]#ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src

2、编译不安装

[root@31yml nginx-1.20.2]#nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --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@31yml 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@31yml nginx-1.20.2]#make
###########注意不要执行  make install

3、查看版本、进行备份

[root@31yml nginx-1.20.2]#cd objs/
[root@31yml objs]#./nginx -v
nginx version: nginx/1.20.2
#备份旧文件(改名),新文件拷贝过去
[root@31yml objs]#mv /apps/nginx/sbin/nginx   /apps/nginx/sbin/nginx.bak
#将低版本的nginx主程序改名
[root@31yml objs]#cp nginx /apps/nginx/sbin/
#新文件拷贝到旧地址
[root@31yml objs]#cd /apps/nginx/sbin/
[root@31yml sbin]#ls
nginx  nginx.bak
[root@31yml sbin]#cat /apps/nginx/logs/nginx.pid 
49128
[root@31yml sbin]#kill -USR2 49128
#发送 2 信号   信号在 man手册中可以看到
[root@31yml sbin]#ps aux|grep nginx
#生成新的master
root      49128  0.0  0.1  46344  2032 ?        Ss   14:28   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx     50027  0.0  0.1  48856  2124 ?        S    15:23   0:00 nginx: worker process
nginx     50029  0.0  0.1  48856  2124 ?        S    15:23   0:00 nginx: worker process
root      53407  0.0  0.1  46220  3368 ?        S    15:46   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx     53411  0.0  0.1  48756  1988 ?        S    15:46   0:00 nginx: worker process
nginx     53412  0.0  0.1  48756  1968 ?        S    15:46   0:00 nginx: worker process
root      53414  0.0  0.0 112824   988 pts/0    S+   15:46   0:00 grep --color=auto nginx

老进程优雅退出

[root@31yml sbin]#kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`
#优雅关闭老进程的  worker 进程
#只对老worker关闭,以防出问题方便“回滚”
[root@31yml sbin]#ps aux|grep nginx
#老worker已经停了
root      49128  0.0  0.1  46344  2032 ?        Ss   14:28   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
root      53407  0.0  0.1  46220  3368 ?        S    15:46   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx     53411  0.0  0.1  48756  1988 ?        S    15:46   0:00 nginx: worker process
nginx     53412  0.0  0.1  48756  1968 ?        S    15:46   0:00 nginx: worker process
root      53726  0.0  0.0 112824   988 pts/0    S+   16:01   0:00 grep --color=auto nginx

若无在运行工作,直接关闭,二号机访问,只看到新版本

image-20230825160430008

回滚

[root@31yml sbin]#kill -HUP `cat /apps/nginx/logs/nginx.pid.oldbin`
#唤起老的进程
[root@31yml sbin]#ps aux|grep nginx
root      49128  0.0  0.1  46344  2056 ?        Ss   14:28   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
root      53407  0.0  0.1  46220  3368 ?        S    15:46   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx     53411  0.0  0.1  48756  1988 ?        S    15:46   0:00 nginx: worker process
nginx     53412  0.0  0.1  48756  2216 ?        S    15:46   0:00 nginx: worker process
nginx     53818  0.0  0.1  48856  2124 ?        S    16:08   0:00 nginx: worker process
nginx     53820  0.0  0.1  48856  2124 ?        S    16:08   0:00 nginx: worker process
root      53841  0.0  0.0 112824   988 pts/0    S+   16:09   0:00 grep --color=auto nginx

[root@31yml sbin]#kill -QUIT `cat /apps/nginx/logs/nginx.pid` 
#针对1.20.0的进程,关闭它
[root@31yml sbin]#ps aux|grep nginx
root      49128  0.0  0.1  46344  2056 ?        Ss   14:28   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx     53818  0.0  0.1  48856  2124 ?        S    16:08   0:00 nginx: worker process
nginx     53820  0.0  0.1  48856  2124 ?        S    16:08   0:00 nginx: worker process
root      53863  0.0  0.0 112824   988 pts/0    S+   16:09   0:00 grep --color=auto nginx

这时候访问,版本又回去了

image-20230825160956721

 
posted @   Bacolate  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示