Nginx 架构和安装

1.1 Nginx 概述

1.1.1 Nginx 介绍

Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus )

2019年3月11日 F5 Networks 6.7亿美元的价格收购

Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器

解决C10K问题(10K Connections)

解决C1000K问题参考链接: http://www.ideawu.net/blog/archives/740.html

Nginx官网:http://nginx.org

nginx的其它的二次发行版:

  • Tengine
    由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始,Tengine成为一个开源项目

    官网: http://tengine.taobao.org/

  • OpenResty

    基于 Nginx 与 Lua 语言的高性能 Web 平台, 章亦春团队开发

    官网:http://openresty.org/cn/

1.1.2 Nginx 功能介绍

  • 静态的web资源服务器html,图片,js,css,txt等静态资源
  • http/https协议的反向代理
  • 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
  • tcp/udp协议的请求转发(反向代理)
  • imap4/pop3协议的反向代理

1.1.3 基础特性

  • 模块化设计,较好的扩展性
  • 高可靠性
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
  • event-driven,aio,mmap,sendfile

1.1.4 Web 服务相关的功能

  • 虚拟主机(server)
  • 支持 keep-alive 和管道连接(利用一个连接做多次请求)
  • 访问日志(支持基于日志缓冲提高其性能)
  • url rewirte
  • 路径别名
  • 基于IP及用户的访问控制
  • 支持速率限制及并发数限制
  • 重新配置和在线升级而无须中断客户的工作进程

1.2 Nginx 架构和进程

1.2.1 Nginx 架构

image

1.2.2 Nginx 进程结构

Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。
image
主进程(master process)的功能:

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

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

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

1.2.3 Nginx 启动和 HTTP 连接建立

image

  • Nginx 启动时,Master 进程,加载配置文件
  • Master 进程,初始化监听的 socket
  • Master 进程,fork 出多个 Worker 进程
  • Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求

1.2.4 HTTP 处理过程

image

Nginx是一种高性能的Web服务器,可以处理大量的并发HTTP请求。Nginx在处理HTTP请求时采用了高效的事件驱动模型,使用异步IO等技术实现了高性能、低延迟的请求处理。
在处理HTTP请求时,Nginx会通过以下步骤进行处理:

  • 读取请求:当客户端发送HTTP请求时,Nginx会使用socket接口读取请求,包括请求头和请求体。
  • 解析请求:Nginx会对请求进行解析,包括解析请求方法、请求路径、查询参数等信息。Nginx还会对请求头进行解析,包括解析Host、User-Agent、Content-Type等字段,这些信息可以在后续处理中使用。
  • 处理请求:根据解析得到的请求信息,Nginx会进行请求处理。比如,如果请求路径对应的是一个静态文件,Nginx会直接返回文件内容;如果请求路径对应的是一个动态页面,Nginx会将请求转发给对应的后端应用服务器。
  • 处理请求体:如果请求包含请求体,Nginx会将请求体读取到内存中,以供后续处理使用。
  • 处理响应:当请求处理完成后,Nginx会根据处理结果生成响应,并发送给客户端。Nginx会将响应头和响应体一起发送给客户端,响应头中包含响应状态码、响应头字段等信息。
  • 关闭连接:当请求处理完成后,Nginx会关闭连接,释放资源,等待下一个请求。

1.3 Nginx 模块介绍

nginx 有多种模块

  • 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
  • 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置等
  • 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
  • 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
  • Stream服务模块: 实现反向代理功能,包括TCP协议代理
  • 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等

nginx高度模块化,但其模块早期不支持DSO机制;1.9.11 版本支持动态装载和卸载

模块分类:

核心模块:core module
标准模块:
 HTTP 模块: ngx_http_*
 HTTP Core modules   #默认功能
 HTTP Optional modules #需编译时指定
 Mail 模块: ngx_mail_*
 Stream 模块 ngx_stream_*
第三方模块

image

1.4 Nginx 安装

1.4.1 Nginx版本和安装方式

Nginx 分为社区版和商业版,一般是社区版

Nginx版本

  • Mainline version 主要开发版本,一般为奇数版本号,比如1.19
  • Stable version 当前最新稳定版,一般为偶数版本,如:1.20
  • Legacy versions 旧的稳定版,一般为偶数版本,如:1.18

Nginx安装可以使用yum或源码安装,但是推荐使用源码编译安装

  • yum/apt的系统仓库版本比较旧
  • 编译安装可以更方便自定义相关路径,使用源码编译可以自定义相关功能,更方便业务的上的使用
  • docker 容器直接运行

1.4.2 Nginx 编译安装

Nginx是由C语言编写而成,所以Nginx源码安装需要提前准备标准的编译器GCC(GNU Compiler collection),由GNU开发,并以GPL即LGPL许可,早期GCC原本只能处理C语言,所以原名为GNU C语言编译器,后来得到快速发展,还可以处理C++,Fortran,pascal,objective-C,java以及Ada等其他语言,此外还需要Automake工具,以完成自动创建Makefile文件,Nginx的一些模块需要依赖第三方库,
比如: pcre(支持rewrite),zlib(支持gzip模块)和openssl(支持ssl模块)等。

1.4.2.1 编译安装 Nginx

官方源码包下载地址
https://nginx.org/en/download.html

1.4.2.2 一键安装 nginx 脚本

#!/bin/bash

NGINX_VERSION=1.22.1
#NGINX_VERSION=1.22.0
#NGINX_VERSION=1.20.2
#NGINX_VERSION=1.18.0
NGINX_FILE=nginx-${NGINX_VERSION}.tar.gz
NGINX_URL=http://nginx.org/download/
NGINX_INSTALL_DIR=/apps/nginx
SRC_DIR=/usr/local/src
CPUS=`lscpu |awk '/^CPU\(s\)/{print $2}'`

. /etc/os-release


color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}


check () {
    [ -e ${NGINX_INSTALL_DIR} ] && { color "nginx 已安装,请卸载后再安装" 1; exit; }
    cd  ${SRC_DIR}
    if [  -e ${NGINX_FILE}${TAR} ];then
        color "相关文件已准备好" 0
    else
        color '开始下载 nginx 源码包' 0
        wget ${NGINX_URL}${NGINX_FILE}${TAR} 
        [ $? -ne 0 ] && { color "下载 ${NGINX_FILE}${TAR}文件失败" 1; exit; } 
    fi
} 

install () {
    color "开始安装 nginx" 0
    if id nginx  &> /dev/null;then
        color "nginx 用户已存在" 1 
    else
        useradd -s /sbin/nologin -r  nginx
        color "创建 nginx 用户" 0 
    fi
    color "开始安装 nginx 依赖包" 0
    if [ $ID == "centos" ] ;then
	    if [[ $VERSION_ID =~ ^7 ]];then
            yum -y  install  gcc  make pcre-devel openssl-devel zlib-devel perl-ExtUtils-Embed
		elif [[ $VERSION_ID =~ ^8 ]];then
            yum -y  install make gcc-c++ libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel perl-ExtUtils-Embed 
		else 
            color '不支持此系统!'  1
            exit
        fi
     elif [ $ID == "rocky"  ];then
	    yum -y  install gcc make gcc-c++ libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel perl-ExtUtils-Embed 
     else
        apt update
        apt -y install gcc make  libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev
     fi
     [ $? -ne 0 ] && { color "安装依赖包失败" 1; exit; } 
     cd $SRC_DIR
     tar xf ${NGINX_FILE}
     NGINX_DIR=`echo ${NGINX_FILE}| sed -nr 's/^(.*[0-9]).*/\1/p'`
     cd ${NGINX_DIR}
     ./configure --prefix=${NGINX_INSTALL_DIR} --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 -j $CPUS && make install 
     [ $? -eq 0 ] && color "nginx 编译安装成功" 0 ||  { color "nginx 编译安装失败,退出!" 1 ;exit; }
	 chown -R nginx.nginx ${NGINX_INSTALL_DIR}
     ln -s ${NGINX_INSTALL_DIR}/sbin/nginx /usr/local/sbin/nginx
     echo "PATH=${NGINX_INSTALL_DIR}/sbin:${PATH}" > /etc/profile.d/nginx.sh
     cat > /lib/systemd/system/nginx.service <<EOF
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=${NGINX_INSTALL_DIR}/logs/nginx.pid
ExecStartPre=/bin/rm -f ${NGINX_INSTALL_DIR}/logs/nginx.pid
ExecStartPre=${NGINX_INSTALL_DIR}/sbin/nginx -t
ExecStart=${NGINX_INSTALL_DIR}/sbin/nginx
ExecReload=/bin/kill -s HUP \$MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
LimitNOFILE=100000

[Install]
WantedBy=multi-user.target
EOF
     systemctl daemon-reload
     systemctl enable --now nginx &> /dev/null 
     systemctl is-active nginx &> /dev/null ||  { color "nginx 启动失败,退出!" 1 ; exit; }
     color "nginx 安装完成" 0
}

check

install

1.5 Nginx 命令和信号

2.5.1 nginx 命令

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

nginx 格式

nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

选项说明

帮助: -? -h
使用指定的配置文件: -c
指定配置指令:-g
指定运行目录:-p
测试配置文件是否有语法错误:-t -T
打印nginx的版本信息、编译信息等:-v -V
发送信号: -s 示例: nginx -s reload=

信号说明:

立刻停止服务:stop,相当于信号SIGTERM,SIGINT
优雅的停止服务:quit,相当于信号SIGQUIT
平滑重启,重新加载配置文件: reload,相当于信号SIGHUP
重新开始记录日志文件:reopen,相当于信号SIGUSR1,在切割日志时用途较大
平滑升级可执行程序:发送信号SIGUSR2,在升级版本时使用
优雅的停止工作进程:发送信号SIGWINCH,在升级版本时使用

范例: 查看nginx帮助

[root@centos8 ~]#nginx -h
nginx version: nginx/1.14.1
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
  -?,-h         : this help
  -v           : show version and exit
  -V           : show version and configure options then exit 
  -t           : test configuration and exit
  -T           : test configuration, dump it and exit
  -q           : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /usr/share/nginx/)
  -c filename   : set configuration file (default: /etc/nginx/nginx.conf)
  -g directives : set global directives out of configuration fil

范例: nginx 命令使用

[root@centos8 ~]#nginx -g "worker_processes 6;"
nginx: [emerg] "worker_processes" directive is duplicate in /apps/nginx/conf/nginx.conf:3

[root@centos8 ~]#vim /apps/nginx/conf/nginx.conf                                
                           
#worker_processes 1;

[root@centos8 ~]#nginx -g "worker_processes 6;"
[root@centos8 ~]#ps aux|grep nginx
root        8843  0.0  0.0  41048   844 ?       Ss   18:53   0:00 nginx: master
process nginx -g worker_processes 6;
nginx       8844  0.0  0.4  74572  4832 ?       S    18:53   0:00 nginx: worker
process
nginx       8845  0.0  0.4  74572  4832 ?       S    18:53   0:00 nginx: worker
process
nginx       8846  0.0  0.4  74572  4832 ?       S    18:53   0:00 nginx: worker
process
nginx       8847  0.0  0.4  74572  4832 ?       S    18:53   0:00 nginx: worker
process
nginx       8848  0.0  0.4  74572  4832 ?       S    18:53   0:00 nginx: worker
process
nginx       8849  0.0  0.4  74572  4832 ?       S    18:53   0:00 nginx: worker
process
root        8851  0.0  0.1  12108  1076 pts/1   S+   18:53   0:00 grep --
color=auto nginx

[root@centos8 ~]#nginx -s quit
[root@centos8 ~]#ps aux|grep nginx
root        8858  0.0  0.1  12108  1100 pts/1   S+   18:54   0:00 grep --color=auto nginx

#前台运行
[root@centos8 ~]#nginx -g 'daemon off;'
^C[root@centos8 ~]#


1.5.2 quit 实现worker进程优雅关闭

  • 设置定时器: worker_shutdown_timeout
http://nginx.org/en/docs/ngx_core_module.html#worker_shutdown_timeout
Syntax: worker_shutdown_timeout time;
Default: —
Context: main
This directive appeared in version 1.11.11.
Configures a timeout for a graceful shutdown of worker processes. When the time expires, nginx will try to close all the connections currently open to facilitate shutdown.
  • 关闭监听句柄
  • 关闭空闲连接
  • 在循环中等待全部连接关闭
  • 退出nginx所有进程

1.5.3 reload 流程

image
image

利用 reload 可以实现平滑修改配置并生效

  • 向master进程发送HUP信号(reload命令)
  • master进程校验配置语法是否正确
  • master进程打开新的监听端口
  • master进程用新配置启动新的worker子进程
  • master进程向老worker子进程发送QUIT信号,老的worker对已建立连接继续处理,处理完才会优雅退出.未关闭的worker旧进程不会处理新来的请求
  • 老worker进程关闭监听句柄,处理完当前连接后结束进程

1.6 Nginx 平滑升级和回滚

有时候需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时Nginx又在跑着业务无法停止,这时就可以选择平滑升级

1.6.1 平滑升级流程

平滑升级四个阶段

  • 只有旧版nginx的master和worker进程

  • 旧版和新版nginx的master和worker进程并存,由旧版nginx接收处理用户的新请求

  • 旧版和新版nginx的master和worker进程并存,由新版nginx接收处理用户的新请求

  • 只有新版nginx的master和worker进程
    image

  • 编译新版本,生成新版本的二进制文件

  • 用新Nginx程序文件替换旧Nginx二进制文件(注意先备份旧版本的二进制文件)

  • 向旧版本的master进程发送USR2信号启动新nginx进程

    master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin

    将新生成的master进程的PID存放至新生成的pid文件nginx.pid

    master进程用新Nginx二进制文件启动新master进程及worker子进程成为旧master的子进程

    系统中将有新旧两个Nginx主进程和对应的worker子进程并存

    当前新的请求仍然由旧Nginx的worker进程进行处理

  • 向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止,旧的Nginx worker进程将不再接收新请求

    当前新的请求由新Nginx的worker进程进行处理

    旧的Nginx Master进程仍然存在

    测试访问确认新版本是否正常工作

  • 如果发现升级正常,向旧master进程发送QUIT信号,关闭旧master,并删除Nginx.pid.oldbin文件,到此旧版本的Nginx彻底下线,新版本正式上线

  • 如果发现升级有问题,可以回滚∶向旧master发送HUP,旧版本的worker开始接收新请求,向新master发送QUIT

1.6.2 平滑升级和回滚案例

#下载最新稳定版
[root@centos8 ~]#wget http://nginx.org/download/nginx-1.20.1.tar.gz
[root@centos8 ~]#tar xvf nginx-1.20.1.tar.gz
[root@centos8 ~]#cd nginx-1.20.1

#查看当前使用的版本及编译选项。结果如下:
[root@centos8 nginx-1.20.1]#/apps/nginx/sbin/nginx -V  
nginx version: nginx/1.18.0
built by gcc 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC)
built with OpenSSL 1.1.1g FIPS  21 Apr 2020
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --withhttp_ssl_module --with-http_v2_module --with-http_realip_module --withhttp_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream
--with-stream_ssl_module --with-stream_realip_module

#configure arguments后面是以前编译时的参数。现在编译使用一样的参数

#开始编译新版本
[root@centos8 nginx-1.20.1]#./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --withhttp_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@centos8 nginx-1.20.1]#make
[root@centos8 nginx-1.20.1]#objs/nginx -v
nginx version: nginx/1.20.1

#查看两个版本
[root@centos8 nginx-1.20.1]#ll objs/nginx /apps/nginx/sbin/nginx
-rwxr-xr-x 1 nginx nginx 7591096 Jun  7 16:28 /apps/nginx/sbin/nginx
-rwxr-xr-x 1 root root  7723272 Jun  7 17:27 objs/nginx

#把之前的旧版的nginx命令备份
[root@centos8 nginx-1.20.1]#cp /apps/nginx/sbin/nginx /opt/nginx.old  

#把新版本的nginx命令复制过去覆盖旧版本程序文件,注意:需要加 -f 选项强制覆盖,否则会提示Text file busy
[root@centos8 nginx-1.20.1]#cp -f ./objs/nginx /apps/nginx/sbin/  

#如果cp 不加-f 选项,会出现下面提示
[root@rocky8 nginx-1.21.6]#cp objs/nginx /apps/nginx/sbin/
cp: overwrite '/apps/nginx/sbin/nginx'? y
cp: cannot create regular file '/apps/nginx/sbin/nginx': Text file busy

#检测新版本和配置文件语法兼职容性
[root@centos8 nginx-1.20.1]#/apps/nginx/sbin/nginx -t  

#发送信号USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx
#此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80
#此时Nginx开启一个新的master进程,且这个新master进程会生成新的worker进程,即升级后的Nginx进程,此时老的进程不会自动退出,新的请求仍由旧进程处理。

[root@centos8 nginx-1.20.1]#kill -USR2 `cat /apps/nginx/logs/nginx.pid`

#可以看到两个master,新的master是旧版master的子进程,并生成新版的worker进程
#注意:在Nginx-1.22.1版中如果看不到下面新版进程,需要重新使用service方式重新启动nginx服务再发送USR2信号
[root@centos8 nginx-1.20.1]#ps auxf|grep nginx
root       12018  0.0  0.0  12112  1092 pts/0   S+   17:32   0:00 |          
\_ grep --color=auto nginx
root        8814  0.0  0.2  42460  3760 ?       Ss   16:58   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx       8957  0.0  0.2  77172  4724 ?       S    17:23   0:00 \_ nginx: worker process
nginx       8958  0.0  0.2  77172  4724 ?       S    17:23   0:00 \_ nginx: worker process
root       12014  0.0  0.3  42448  5512 ?       S    17:32   0:00 \_ nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx      12015  0.0  0.2  77192  4904 ?       S    17:32   0:00     \_nginx: worker process
nginx      12016  0.0  0.2  77192  4908 ?       S    17:32   0:00     \_nginx: worker process

[root@centos8 nginx-1.20.1]#lsof -i :80
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx    8814 root   8u IPv4  40843     0t0 TCP *:http (LISTEN)
nginx    8957 nginx   8u IPv4  40843     0t0 TCP *:http (LISTEN)
nginx    8958 nginx   8u IPv4  40843     0t0 TCP *:http (LISTEN)
nginx   12014 root   8u IPv4  40843     0t0 TCP *:http (LISTEN)
nginx   12015 nginx   8u IPv4  40843     0t0 TCP *:http (LISTEN)
nginx   12016 nginx   8u IPv4  40843     0t0 TCP *:http (LISTEN)

#如果有新请求,仍由旧版本提供服务
[root@ubuntu2204 ~]#curl -I http://10.0.0.8
HTTP/1.1 200 OK
Server: nginx/1.18.0

#先关闭旧nginx的worker进程,而不关闭旧nginx主进程方便回滚
#向原老的Nginx主进程发送WINCH信号,它会平滑关闭老的工作进程(主进程不退出),这时所有新请求都会由新版Nginx处理
[root@centos8 nginx-1.20.1]#kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`

#如果旧版worker进程有用户的旧的请求,会一直等待处理完后才会关闭,即平滑关闭
[root@centos8 nginx-1.20.1]#ps auxf|grep nginx
root       12066  0.0  0.0  12112  1112 pts/0   S+   17:38   0:00 |          \_ grep --color=auto nginx
root        8814  0.0  0.1  42460  2656 ?       Ss   16:58   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx       8957  0.0  0.1  77172  3484 ?       S    17:23   0:00 \_ nginx: worker process is shutting down
root       12014  0.0  0.2  42448  3664 ?       S    17:32   0:00 \_ nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx      12015  0.0  0.1  77192  3284 ?       S    17:32   0:00     \_ nginx: worker process
nginx      12016  0.0  0.1  77192  3280 ?       S    17:32   0:00     \_ nginx: worker process
[root@centos8 nginx-1.20.1]#pstree -p|grep nginx
           |-nginx(8814)---nginx(12014)-+-nginx(12015)
		   |                            `-nginx(12016)
		   
#如果有新请求,由新版本提供服务
[root@ubuntu2204 ~]#curl -I http://10.0.0.8
HTTP/1.1 200 OK
Server: nginx/1.20.1

#################注意:此处如果是虚拟机先做快照方便测试回滚########################


########################升级#################################

#经过一段时间测试,新版本服务没问题,最后发送QUIT信号,退出老的master,完成全部升级过程
[root@centos8 nginx-1.20.1]#kill -QUIT `cat /apps/nginx/logs/nginx.pid.oldbin`  


#查看版本是不是已经是新版了
[root@centos8 nginx-1.20.1]#nginx -v
nginx version: nginx/1.20.1
[root@centos8 nginx-1.20.1]#curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Mon, 07 Jun 2021 09:48:48 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 07 Jun 2021 08:28:12 GMT
Connection: keep-alive
ETag: "60bdd89c-264"
Accept-Ranges: bytes


#如果有旧的连接,不会立即关闭旧版本的Master和对应的Worker进程,直到所有旧连接断开,才会关闭所
的旧的进程
[root@ubuntu2204 nginx-1.20.1]#ps auxf|grep nginx
root        4381  0.0  0.1   9584  2308 pts/0   S+   10:44   0:00 |       \_ grep--color=auto nginx
root        1215  0.0  0.1  10160  2088 ?       Ss   10:12   0:00 nginx: master process /apps/nginx/sbin/nginx
nginx       1219  0.0  0.2  10896  4428 ?       S    10:12   0:00 \_ nginx: worker process is shutting down
root        4342  0.0  0.3  10172  6476 ?       S    10:34   0:00 \_ nginx: master process /apps/nginx/sbin/nginx
nginx       4343  0.0  0.2  10908  4104 ?       S    10:34   0:00     \_ nginx: worker process
nginx       4344  0.0  0.1  10908  3608 ?       S    10:34   0:00     \_ nginx: worker process
nginx       4345  0.0  0.2  10908  4168 ?       S    10:34   0:00     \_ nginx: worker process
nginx       4346  0.0  0.1  10908  3608 ?       S    10:34   0:00     \_ nginx: worker process


######################回滚###########################################

#如果升级的新版本发现问题需要回滚,可以发送HUP信号,重新拉起旧版本的worker
[root@centos8 nginx-1.20.1]#kill -HUP `cat /apps/nginx/logs/nginx.pid.oldbin`
[root@centos8 nginx-1.20.1]#pstree -p |grep nginx
           |-nginx(8814)-+-nginx(12014)-+-nginx(12015)
           |             |              `-nginx(12016)
           |             |-nginx(12090)
           |             `-nginx(12091)
		   
 #最后关闭新版的master和worker,如果不执行上面的HUP信号,此步QUIT信号也可以重新拉起旧版本的worker进程
[root@centos8 nginx-1.20.1]#kill -QUIT `cat /apps/nginx/logs/nginx.pid`

#恢复旧版的文件
[root@rocky8 ~]#mv /opt/nginx.old   /apps/nginx/sbin/
mv: overwrite '/apps/nginx/sbin/nginx'? y
posted @   Shine、  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示