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 架构
1.2.2 Nginx 进程结构
Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成。
主进程(master process)的功能:
对外接口:接收外部的操作(信号)
对内转发:根据外部的操作的不同,通过信号管理 Worker
监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
读取Nginx 配置文件并验证其有效性和正确性
建立、绑定和关闭socket连接
按照配置生成、管理和结束工作进程
接受外界指令,比如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应用新的配置
开启日志文件,获取文件描述符
不中断服务,实现平滑升级,升级失败进行回滚处理
编译和处理perl脚本
工作进程(worker process)的功能:
所有 Worker 进程都是平等的
实际处理:网络请求,由 Worker 进程处理
Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源,
增加上下文切换的损耗
接受处理客户的请求
将请求依次送入各个功能模块进行处理
I/O调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等
1.2.3 Nginx 启动和 HTTP 连接建立
- Nginx 启动时,Master 进程,加载配置文件
- Master 进程,初始化监听的 socket
- Master 进程,fork 出多个 Worker 进程
- Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求
1.2.4 HTTP 处理过程
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_*
第三方模块
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/bashNGINX_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-releasecolor () {RES_COL=60MOVE_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_COLecho -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} ];thencolor "相关文件已准备好" 0elsecolor '开始下载 nginx 源码包' 0wget ${NGINX_URL}${NGINX_FILE}${TAR} [ $? -ne 0 ] && { color "下载 ${NGINX_FILE}${TAR}文件失败" 1; exit; } fi
} install () {color "开始安装 nginx" 0if id nginx &> /dev/null;thencolor "nginx 用户已存在" 1 elseuseradd -s /sbin/nologin -r nginxcolor "创建 nginx 用户" 0 ficolor "开始安装 nginx 依赖包" 0if [ $ID == "centos" ] ;thenif [[ $VERSION_ID =~ ^7 ]];thenyum -y install gcc make pcre-devel openssl-devel zlib-devel perl-ExtUtils-Embedelif [[ $VERSION_ID =~ ^8 ]];thenyum -y install make gcc-c++ libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel perl-ExtUtils-Embed else color '不支持此系统!' 1exitfielif [ $ID == "rocky" ];thenyum -y install gcc make gcc-c++ libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel perl-ExtUtils-Embed elseapt updateapt -y install gcc make libpcre3 libpcre3-dev openssl libssl-dev zlib1g-devfi[ $? -ne 0 ] && { color "安装依赖包失败" 1; exit; } cd $SRC_DIRtar 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/nginxecho "PATH=${NGINX_INSTALL_DIR}/sbin:${PATH}" > /etc/profile.d/nginx.shcat > /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
EOFsystemctl daemon-reloadsystemctl enable --now nginx &> /dev/null systemctl is-active nginx &> /dev/null || { color "nginx 启动失败,退出!" 1 ; exit; }color "nginx 安装完成" 0
}checkinstall
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 流程
利用 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进程
-
编译新版本,生成新版本的二进制文件
-
用新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