Nginx 架构和安装

news/2025/1/24 13:40:35/文章来源:https://www.cnblogs.com/Dxj01/p/18689350

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/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 流程

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/874703.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux命令大全-快速查询手册

访问地址: 线上访问:https://git.io/linux 开源社区:https://github.com/jaywcjlove/linux-command 简要介绍: Linux 命令大全搜索工具,内容包含 Linux 命令手册、详解、学习、搜集,中文解释,支持背景切换。主要功能: 当前仓库搜集了 580 多个 Linux 命令,是一个非盈利…

IPTVnator - 最方便的开源 IPTV 播放器

IPTVnator 是一款视频播放器应用程序,提供对 IPTV 播放列表播放(m3u、m3u8)的支持。该应用程序允许用户使用远程 URL 或从本地文件系统上传文件来导入播放列表。此外,它还支持 XMLTV 格式的 EPG 信息,可以通过 URL 提供。该应用程序是一个使用 Electron(目前正在迁移到 T…

中电金信首次通过数据管理能力成熟度(DCMM)四级认证

日前,中国电子信息行业联合会发布《关于公布获得数据管理能力成熟度等级证书单位的通知(第十四批)》,中电金信正式通过数据管理能力成熟度(DCMM)等级认定——量化管理级(4级)。DCMM即数据管理能力成熟度评估模型(Data management Capability Maturity Model),是我国首…

执子之手与子偕老:镌刻在时光深处的爱情传奇

执子之手与子偕老:镌刻在时光深处的爱情传奇“死生契阔,与子成说。执子之手,与子偕老。” 这出自《诗经・邶风・击鼓》的千古名句,如同一首跨越千年的悠扬情歌,萦绕在人类情感的天际,描绘出爱情最纯粹、最美好的模样,承载着人们对永恒相伴、不离不弃的深深期许。它不仅仅…

二维数点问题

二维数点问题。P10814 【模板】离线二维数点 询问区间 \([l,r]\) 内,在值域为 \([0,x]\) 中数的个数。 想象这是个二维平面,我们要求的就是矩形内点的个数。通常用 cdq 做,将询问拆成两个点,将点按照x坐标排序,按照y坐标加入到树状数组中(为了满足第二条限制),这时就依次…

CS162 23Fall总结

CS 162 23Fall Lab 总结 PintOS是一个x86架构的教育用操作系统,它支持多线程,加载并运行用户程序,以及文件系统。骨架代码只提供了很简单的实现,本Lab需要丰富并增强这些模块的功能。本实验提供Bochs2和QEMU3模拟器模拟x86 CPU和相应外设来运行并调试PintOS.PintOS源码结构…

《汇编语言》阅读笔记

如题汇编语言 首先,我必须赞扬王爽老师,这是我见过写的最好的教科书了. 然后要注意,汇编语言这本书的前提是8086PC机十六位处理器.还要学x86和x64以及其他奇奇怪怪的架构的汇编 全称 AH&AL=AX(accumulator):累加寄存器 BH&BL=BX(base):基址寄存器 CH&CL=CX(co…

【unity】学习制作2D横板冒险游戏-3-

添加野猪添加刚体2D组件,碰撞组件,该碰撞组件是确保野猪能跟地面碰撞添加玩家图层和敌人图层,并应用,使野猪和玩家不会彼此被推着走碰撞剔除中选择Player和Enemy再增加一个碰撞组件当作触发器,设置如下,该碰撞组件是确保人物和怪物的互动基本属性及其计算 再如图路径下创建…

远控流畅游戏,我用过最棒工具ToDesk

孤独乏味人又懒,能够干嘛来消遣?手游、端游都好玩,没有高端设备在身边,也是能够轻松玩!究竟怎么实现的?其实就是通过ToDesk这种专业的远程控制软件来随时随地操作异地的目标设备从而帮助实现更丝滑给力的远程游戏畅玩体验!当然,用户能够借助完成这需求的辅助工具并不止…

C# Odbc Informix读取中文方法

一。 部署好informix服务器后 二。 在windows主机安装好Informix Client-SDK, 这个软件客户端时免费的,可以在官网下载 三。配置好ODBC连接 1.用户名密码服务端口自行填写 2.关于客户语言的配置要使用以下参数: Client Locale -> en_US.CP1252 Database Locale -> en_…

ToDesk远程连接几项模式区别何在?

对于很多用过ToDesk远程控制软件进行随时随地跨系统、跨设备操作的小伙伴们来说,它无疑能解决做种场景下问题,无论是在职场工作中,还是日常生活中,均能带来很多便捷!虽然轻松使用很简单,但很多所不知道的是其实应对不同的情况,选择不同的连接模式更有益!以下木木小编就…

如何在网站后台修改首页?

修改网站后台首页通常涉及对后台管理界面的调整。以下是详细步骤:登录后台:使用管理员账号登录网站后台管理系统。 进入模板管理:在后台管理系统中找到“模板管理”或“模板文件管理”选项。 编辑模板文件:找到后台首页的模板文件(如index.htm或index.php),使用代码编辑…