LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

高性能 WEB 服务器:Nginx 基础

admin
2025年6月29日 18:42 本文热度 36

主流的 WEB 服务器介绍

Web服务器是提供Web信息服务的软件,它通过HTTP或HTTPS协议与客户端通信,接受客户端请求,处理请求,然后返回响应数据,Web 服务器的主要工作是通过存储、处理和交付网页给用户来显示网站内容,一个成熟的WEB服务器软件不仅仅只是处理客户端请求,还要有良好的安全性和稳定性,以满足用户不断变化和增长的需求

以下是一些主流的Web服务器以及它们的特点,这些Web服务器都有各自特点和优势,在使用的时候,要取决于项目需求,性能要求及开发人员偏好等

Apache

Apache 是目前市场占有率最高的WEB服务器,它免费开源,功能强大,支持多种操作系统,可在多平台上运行,包括Unix、Linux、Windows等,同时具有强大的模块化体系结构,提供了丰富的模块,也支持许多第三方模块,允许用户自定义服务器功能,另外也支持虚拟主机配置

Nginx

Nginx是一个高性能的Web服务器,广泛应用于高并发、大流量的互联网应用场景中,Nginx还可以作为反向代理服务器、负载均衡服务器,其优异的静态处理能力,使其在处理静态文件时具有很高的效率,由于选择了高效的网络IO模型,使其在高并发大流量的工作场景下,对于资源(CPU,内存等)的要求非常低,且运行非常稳定

Microsoft IIS(Internet Information Services)

Microsoft IIS 是微软公司开发的一种Web服务组件,其中包括WEB服务器, FTP服务器,NNTP服务器和SMTP服务器,分别用于网页浏览,文件传输,新闻服务和邮件服务等业务,它提供ISAPI作为扩展WEB服务器功能的编程接口,对ASP、NET等微软技术有很好的支持,同时还提供了Internet,可以实现对数据库的查询和更新

Tomcat

Tomcat是一个开放源代码、运行servlet和JSP Web应用软件,它不仅仅是一个WEB服务器,也是一个Servlet和JSP容器,但其对静态文件和高并发的处理能力较弱

WEB 服务器市场占有率排名

Netcraft公司于1994年底在英国成立,多年来一直致力于互联网市场以及在线安全方面的咨询服务,其中在国际上最具影响力的当属其针对网站服务器,域名解析/主机提供商,以及SSL市场所做的客观严谨的分析研究。

#统计网站https://www.netcraft.com/resources/?type=blog&topic=web-server-survey

1 Nginx 基础

1.1 Nginx 介绍

Nginx 是一个强大而灵活的服务器软件,适用于处理高流量、高并发的Web应用程序,同时具有反向代理、负载均衡、静态文件服务等多种功能。由于其性能和可配置性,NGINX被广泛应用于许多大型网站和应用,NGINX 由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru 站点开发的,开发工作最早从2002年开始,第一版发公开发布时间是 2004 年 10月4日,版本号为 0.1.0

2019 年 3 月份,F5 公司与 Nginx 达成协议,F5 将收购 Nginx 所有的已发行股票,总价值约为 6.7 亿美金,合约人民币 44.97 亿人民币, Nginx 的核心模块代码总量约为 198430 行(包括空格,注释),所以我们可以认为 Nginx 项目的一行代码的值约为 2.2万人民币

Nginx 经历了十几年的迭代更新(nginx.org/en/CHANGES),目前功能已经非常完善且运行稳定,当前该项目分为社区版和商业版,社区版里面又分为开发版(版本号为奇数),最新稳定版(版本号为偶数)和过期版,Nginx 功能丰富,可以作为 WEB 服务器使用,也可以作为反向代理服务器或者邮件服务器,能够快速的响应静态网页请求,支持 FastCGI/SSL/Virtual Host/URL Rwrite/Gzip/HTTP Basic Auth/HTTP 或 TCP 负载均衡(v1.9版本以上且开启 stream 模块)等功能,并且支持第三方的功能扩展

另外,还有一些基于 Nginx 做二次开发的项目,其中比较著名的有 Tengine,OpenResty 等

http://nginx.org/ #开源项目网站https://nginx.com/ #商业化项目网站https://www.nginx-cn.net/ #中文商业化项目网站https://tengine.taobao.org/ #Tengine 官网

1.2 Nginx 架构和工作模型

Nginx 整体架构

Nginx 工作模型

在Nginx中,Master进程和Worker进程分别承担不同的角色,共同协作以提供高性能的服务

Master 进程

  • 启动过程: 当你启动Nginx时,Master进程首先启动。它会读取配置文件,初始化全局资源,并创建指定数量的Worker进程

  • 创建 Worker 进程: Master进程会创建Worker进程来处理实际的客户端请求。每个Worker进程都是一个独立的进程,它们之间相互独立,互不影响

  • 管理 Worker 进程: Master进程负责监控Worker进程的状态。如果某个Worker进程异常退出(比如发生错误),Master进程会重新启动一个新的Worker进程,以确保服务的可用性


Worker 进程

  • 处理客户端请求: Worker进程是实际处理客户端请求的进程。每个Worker进程是单线程的,但通过多进程的方式,Nginx能够同时处理多个请求,实现高并发

  • 事件驱动和异步处理: Worker进程采用事件驱动的异步模型。它使用事件循环和非阻塞I/O操作,允许在不同的连接之间高效切换,以处理大量并发请求

  • 负载均衡: 如果配置了负载均衡,多个Worker进程可以分担负载,均衡地分配请求,提高系统的整体性能


Master 进程 与 Worker 进程的联系

在运行时,Master 进程负责监控 Worker 进程的状态,如果某个 Worker 进程异常退出,Master 进程会重新启动一个新的 Worker 进程,确保服务的稳定性。Master 进程和 Worker 进程之间通过信号进行通信,例如在重新加载配置时,Master 进程会向 Worker 进程发送信号,通知它们重新加载配置而无需停止服务

这种Master-Worker模型使Nginx在高并发环境下表现出色,同时能够保持稳定性和可扩展性。Master进程和Worker进程之间的协同工作是Nginx架构的关键之一

#nginx 中的 master 进程和 worker 进程[root@ubuntu ~]# ps aux | grep nginx
[root@ubuntu ~]# pstree -p | grep nginx

1.3 Nginx 模块

Nginx的模块化设计使得用户可以根据需求选择并集成不同类型的模块,从而定制化地配置和扩展Nginx服务器的功能

Nginx 模块可以分为两大类:核心模块和第三方模块

核心模块(Core Modules)

Nginx 的核心模块主要有三部分,分别是

  • Events Module: 处理与事件相关的操作,如连接的接受和关闭。包括事件驱动机制等

  • HTTP Module: 处理 HTTP 请求和响应,包括配置 HTTP 服务器、反向代理和负载均衡等

  • Mail Module:提供邮件代理服务顺的功能,支持 IMAP,POP3等协议


其中 HTTP 模块又包含以下几部分

  • Core Module: 包含基本的 HTTP 功能,如配置服务器块、location 块等

  • Access Module: 处理访问控制,包括允许或拒绝特定的 IP 地址或用户

  • FastCGI Module: 支持 FastCGI 协议,用于与 FastCGI 进程通信

  • Proxy Module: 提供反向代理功能,用于将请求代理到后端服务器

  • Upstream Module: 用于定义负载均衡的后端服务器组


第三方模块(HTTP Modules)

Nginx提供了一套模块化的架构,允许开发者编写自定义的模块来扩展功能。这些第三方模块可以包括但不限于以下几类

  • HTTP 模块: 扩展HTTP模块的功能,添加自定义的处理逻辑

  • Filter 模块: 提供对HTTP请求和响应进行过滤的功能

  • Load Balancer 模块: 实现负载均衡策略

  • Access Control 模块: 控制对资源的访问权限

  • Security 模块: 提供安全性增强的功能,如防火墙、DDoS防护等

  • Authentication 模块: 处理用户认证逻辑


https://nginx.org/en/docs/ #nginx 模块列表

1.4 Nginx 版本和安装

1.4.1 Nginx 版本

Nginx 官方将 Nginx 分为三个类型的版本,分别是 Mainline,Stable,Legacy

Mainline(主线版)

  • Mainline 版本是 Nginx 的主要开发版本,包含最新的功能和改进,这个版本通常包含最新的实验性功能和性能优化,但相对较新,可能存在一些未经广泛测试的特性

  • Mainline 版本是面向那些希望尝试最新功能并能够接受一些潜在风险的用户和开发者

  • Mainline 版在完成充分的测试和功能迭代之后会变成 Stable 版,然后官方会开一个新的 Mainline版

  • Mainline 版的版本号一般为奇数


Stable(稳定版)

  • Stable 版本是相对于 Mainline 版本更为稳定和经过充分测试的版本,它包含了经过验证的功能和修复了已知问题的代码

  • Stable 版本是面向那些更注重稳定性和可靠性的生产环境用户的选择,该版本可能不包含最新的功能,但在生产环境中更为安全可靠

  • Stable 版的版本号一般为偶数


Legacy (历史版本)

  • 已经归档的稳定版,版本号一般为偶数


用户可以根据其需求选择使用 Mainline 版本或 Stable 版本,在开发和测试阶段,可以选择 Mainline 版本已获得最新的功能和改进。而在生产环境中,通常建议选择 Stable 版本,以确保系统的稳定性和可靠性

https://nginx.org/en/download.html #下载页面https://nginx.org/en/linux_packages.html #安装源配置页面

1.4.2 Nginx 安装

Nginx 二进制包安装

Nginx 一般可以使用 apt/yum 来安装二进制包,如果需要使用特定的功能模块,也可以使用源码安装,使用 yum/apt 安装的时候,只能安装操作系统发行版厂商已经提交到仓库中的版本,如果需要安装更新的版本或历史版本,可自行配置官方仓库,然后进行安装

#ubuntu2204 中可安装的 nginx[root@ubuntu ~]# apt list nginx -a
#rocky9.2 中可安装的 nginx[root@rocky ~]# yum list nginx
[root@ubuntu ~]# apt install nginx -y[root@ubuntu ~]# apt info nginx[root@ubuntu ~]# dpkg -l nginx
#有多个包[root@ubuntu ~]# dpkg -L nginxnginx nginx-common nginx-core
[root@ubuntu ~]# dpkg -L nginx-core/./usr/usr/sbin/usr/sbin/nginx #二进制文件......
#配置文件,默认网站根目录文件,模块目录等[root@ubuntu ~]# dpkg -L nginx-common
#配置文件目录[root@ubuntu ~]# ls -l /etc/nginx/
#网站根目录[root@ubuntu ~]# ls -l /var/www/
#查看服务状态[root@ubuntu ~]# systemctl status nginx.service#查看版本[root@ubuntu ~]# nginx -vnginx version: nginx/1.18.0 (Ubuntu)#查看编译选项[root@ubuntu ~]# nginx -V

Nginx 源码编译安装

#安装编译工具链[root@ubuntu ~]# apt update[root@ubuntu ~]# apt install -y make gcc libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev
#创建运行用户[root@ubuntu ~]# useradd -r -s /usr/sbin/nologin nginx
#下载最新版源码并解压[root@ubuntu ~]# wget https://nginx.org/download/nginx-1.22.1.tar.gz[root@ubuntu ~]# tar xf nginx-1.22.1.tar.gz[root@ubuntu ~]# cd nginx-1.22.1/
#编译安装[root@ubuntu nginx-1.22.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[root@ubuntu nginx-1.22.1]# make && make install
#修改目录属主属组并查看[root@ubuntu nginx-1.22.1]# chown -R nginx.nginx /apps/nginx/[root@ubuntu nginx-1.22.1]# ls -l /apps/nginx/total 16drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 conf #配置文件目录drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 html #网站文件根目录drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 logs #日志文件目录drwxr-xr-x 2 nginx nginx 4096 Jan 20 15:35 sbin #二进制程序目录
#创建软链接[root@ubuntu nginx-1.22.1]# ln -sv /apps/nginx/sbin/nginx /usr/sbin/nginx'/usr/sbin/nginx' -> '/apps/nginx/sbin/nginx'
#查看版本[root@ubuntu nginx-1.22.1]# nginx -vnginx version: nginx/1.22.1[root@ubuntu nginx-1.22.1]# nginx -V
[root@ubuntu nginx-1.22.1]# cd[root@ubuntu ~]# which nginx/usr/sbin/nginx
#默认没有服务脚本[root@ubuntu ~]# systemctl status nginxUnit nginx.service could not be found.[root@ubuntu ~]# ps aux | grep nginx
#直接启动nginx,一个master进程,一个worker进程[root@ubuntu ~]# nginx[root@ubuntu ~]# ps aux | grep nginx
#先停止,直接启动不能用systemctl 管理[root@ubuntu ~]# nginx -s stop
#创建PID 目录[root@ubuntu ~]# mkdir /apps/nginx/run[root@ubuntu ~]# chown -R nginx.nginx /apps/nginx/run
#创建nginx服务脚本[root@ubuntu ~]# cat /usr/lib/systemd/system/nginx.service[Unit]Description=nginx - high performance web serverDocumentation=http://nginx.org/en/docs/After=network-online.target remote-fs.target nss-lookup.targetWants=network-online.target
[Service]Type=forkingPIDFile=/apps/nginx/run/nginx.pidExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.confExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s TERM $MAINPIDLimitNOFILE=100000
[Install]WantedBy=multi-user.target
#修改配置文件,设置pid文件路径[root@ubuntu ~]# cat /apps/nginx/conf/nginx.confpid /apps/nginx/run/nginx.pid;
#重载服务脚本[root@ubuntu ~]# systemctl daemon-reload
#直接启动的 nginx 不能用 service 来管理[root@ubuntu ~]# systemctl status nginx
#用服务启动[root@ubuntu ~]# systemctl start nginx
#查看状态[root@ubuntu ~]# systemctl status nginx.service
#导入man手册[root@ubuntu ~]# man nginxNo manual entry for nginx
#导入man 手册[root@ubuntu ~]# cp nginx-1.22.1/man/nginx.8 /usr/share/man/man8/[root@ubuntu ~]# mandb[root@ubuntu ~]# whereis nginxnginx: /usr/sbin/nginx /usr/share/man/man8/nginx.8

1.5 Nginx 命令和信号

[root@ubuntu ~]# nginx -hnginx version: nginx/1.18.0 (Ubuntu)Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
#常用选项?|-h #显示帮助信息#显示版本信息#显示版本信息和编译项#检查并测试配置文件#检查并测试配置文件,且输出配置文件内容#在配置文件测试期间禁止显示非错误消息s signal #发送信号 stop|quit|reopen|reloadp prefix #指定运行目录,默认是 /usr/share/nginx/c filename #指定配置文件,默认是 /etc/nginx/nginx.confg directive #启动时指定一些全局配置项,而不用修改配置文件,格式为 k v
#信号说明stop #立即停止,没处理完的请求也会被立即断开,相当于信号 SIGTERM,SIGINTquit #优雅退出,不再接收新的请求,但己建立的连接不受影响,相当于信号 SIGQUITreopen #重开一个新的日志文件,日志内容写新文件,相当于信号 SIGUSR1reload #重新加载配置文件,重新生成worker 进程,不中断正在处理的请求,己建立的连接按旧配置处理,新连接用新配置处理       #同 systemctl reload nginxSIGUSR2 #平滑升级二进制文件,适用于版本升级SIGWINCH #优雅的停止工作进程,适用于版本升级
配置文件检测
#检查配置文件语法,并测试配置文件[root@ubuntu ~]# nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is oknginx: configuration file /etc/nginx/nginx.conf test is successful
[root@ubuntu ~]# echo $?0 
#检查配置文件语法,并测试配置文件,仅输出错误信息[root@ubuntu ~]# nginx -t -q
[root@ubuntu ~]# echo $?0
在配置文件外指定配置项
[root@ubuntu ~]# cat /etc/nginx/nginx.confuser www-data;#worker_processes auto; #注释此项pid /run/nginx.pid;include /etc/nginx/modules-enabled/*.conf;
#在命令行中指定配置并启动[root@ubuntu ~]# nginx -g "worker_processes 1;"
#查看,一个master,一个worker[root@ubuntu ~]# ps aux | grep nginx

发送信号

#在服务端创建一个100M的文件[root@ubuntu ~]# dd if=/dev/zero of=/var/www/html/test.img bs=1M count=100
#客户端限速下载,每秒下1M,所以需要100M[root@ubuntu ~]# wget --limit-rate=1024000 http://10.0.0.206/test.img
#在客户端下载的过程中服务端发送 stop 信号,客户端会立即断开#再次测试发送 quit 信号#当前一个 master,两个 worker[root@ubuntu ~]# ps aux | grep nginx
#发送 quit 信号[root@ubuntu ~]# nginx -s quit#还有一个 worker 进程,下载请求没有中断[root@ubuntu ~]# ps aux | grep nginx
#但无法建立新连接[root@ubuntu ~]# curl 127.1curl: (7) Failed to connect to 127.0.0.1 port 80 after 0 ms: Connection refused
#下载请求完成后,就没有进程,彻底退出[root@ubuntu ~]# ps aux | grep nginx
#reload信号#当前一个master,两个worker[root@ubuntu ~]# ps aux | grep nginx
#客户端开启一个下载进程#修改配置文件[root@ubuntu ~]# cat /etc/nginx/nginx.confuser www-data;worker_processes 3#将工作进程数改为3#发送reload,并查看#可以看到 master 96020 进程号没有变化, worker 96021 没有变化,因为 96021 维持着旧的下载连接 
#新的配置生成了96053,96054,96095三个 worker 进程[root@ubuntu ~]# nginx -s reload[root@ubuntu ~]# ps aux | grep nginx
#下载请求完成后,再次查看进程,96021 消失
#reopen信号[root@ubuntu ~]# ls -lh /var/log/nginx/-rw-r----- 1 www-data adm 1398 Jan 20 20:25 access.log #当前大小 1398-rw-r----- 1 www-data adm 1340 Jan 20 20:25 error.log
#移走日志文件[root@ubuntu ~]# mv /var/log/nginx/access.log /var/log/nginx/access.log.bak[root@ubuntu ~]# ls -l /var/log/nginx/total 8-rw-r----- 1 www-data adm 1398 Jan 20 20:25 access.log.bak-rw-r----- 1 www-data adm 1340 Jan 20 20:25 error.log
#发送请求,并查看日志[root@ubuntu ~]# curl 127.1 &>/dev/null[root@ubuntu ~]# ls -l /var/log/nginx/total 8-rw-r----- 1 www-data adm 1484 Jan 20 20:26 access.log.bak #还是记录到旧日志中了-rw-r----- 1 www-data adm 1340 Jan 20 20:25 error.log
#发送信号,并查看日志,会发现生成了新日志[root@ubuntu ~]# nginx -s reopen[root@ubuntu ~]# ls -l /var/log/nginx/total 8-rw-r--r-- 1 www-data root 0 Jan 20 20:26 access.log #新日志0字节-rw-r----- 1 www-data adm 1484 Jan 20 20:26 access.log.bak-rw-r----- 1 www-data adm 1405 Jan 20 20:26 error.log
#再次发送请求,日志内容被记录到新文件中了[root@ubuntu ~]# curl 127.1 &>/dev/null[root@ubuntu ~]# ls -l /var/log/nginx/total 12-rw-r--r-- 1 www-data root 86 Jan 20 20:32 access.log #新日志写入了内容-rw-r----- 1 www-data adm 1484 Jan 20 20:26 access.log.bak #大小没有变化-rw-r----- 1 www-data adm 1405 Jan 20 20:26 error.log

1.6 Nginx 平滑升级和回滚

Nginx 的平滑升级是指在不中断服务的情况下进行软件版本或配置文件的更新。通过平滑升级,Nginx能够在运行时应用新的配置或软件版本,继续处理请求,而不影响现有的连接

平滑升级的主要优势在于,它允许 Nginx 在更新时保持对服务的连续响应,避免中断用户的请求,这对于具有高可用性要求的生产环境非常重要,然而,需要注意的是,平滑升级并不适用于所有场景,特别是在某些配置或软件更改可能导致不兼容性问题的情况下,在进行平滑升级之前,建议先在测试环境中进行充分的测试

平滑升级通常包括以下步骤:

  • 新版本或配置准备:准备好新版本的 Nginx 可执行文件或配置文件,并确保它们没有问题

  • 新版本资源替换旧版本资源:进行资源替换,此步骤要备份旧版本资源,可以用作回滚

  • 发送信号:使用 nginx -s SIGUSR2,nginx -s reload 等方式向 Nginx 主进程发送重新加载的信号

  • 新的工作进程启动:Nginx 主进程接收到重新加载信号后,会启动新的工作进程,并使用新的配置文件或软件版本

  • 平滑过渡:新的工作进程逐渐接管现有的连接。现有的连接会在旧的工作进程中继续处理,而新的连接会由新的工作进程处理

  • 旧的进程退出:当旧的工作进程不再有活动连接时,它会被关闭


#查看当前使用的版本和编译选项[root@ubuntu ~]# nginx -Vnginx version: nginx/1.22.1built by gcc 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)built with OpenSSL 3.0.2 15 Mar 2022TLS SNI support enabledconfigure 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
#修改当前配置文件,至少保证两个worker进程,便于测试[root@ubuntu ~]# cat /apps/nginx/conf/nginx.confworker_processes 2;[root@ubuntu ~]# nginx -s reload[root@ubuntu ~]# ps auxf | grep nginxroot 6757 0.0 0.1 10164 3116 ? Ss 21:50 0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.confnginx 88774 0.0 0.1 10916 3688 ? S 22:30 0:00 \_ nginx: worker processnginx 88775 0.0 0.1 10916 3688 ? S 22:30 0:00 \_ nginx: worker process
#编译新版本[root@ubuntu ~]# wget https://nginx.org/download/nginx-1.24.0.tar.gz[root@ubuntu ~]# tar xf nginx-1.24.0.tar.gz[root@ubuntu ~]# cd nginx-1.24.0[root@ubuntu nginx-1.24.0]# ./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, 会在 objs 目录中生成新的二进制文件[root@ubuntu nginx-1.24.0]# make
#新版二进制文件[root@ubuntu nginx-1.24.0]# ./objs/nginx -vnginx version: nginx/1.24.0
#现在正在使用的[root@ubuntu nginx-1.24.0]# nginx -vnginx version: nginx/1.22.1
#对比[root@ubuntu nginx-1.24.0]# ll ./objs/nginx /apps/nginx/sbin/nginx-rwxr-xr-x 1 nginx nginx 5884528 Jan 20 21:43 /apps/nginx/sbin/nginx*-rwxr-xr-x 1 root root 5929488 Jan 20 22:10 ./objs/nginx*
#当前正在运行的是旧版[root@ubuntu nginx-1.24.0]# nginx -vnginx version: nginx/1.22.1
#保留旧版二进制文件备份[root@ubuntu nginx-1.24.0]# mv /apps/nginx/sbin/nginx{,.122}[root@ubuntu nginx-1.24.0]# ls /apps/nginx/sbin/nginx.122
#复制新的二进制文件[root@ubuntu nginx-1.24.0]# cp objs/nginx /apps/nginx/sbin/[root@ubuntu nginx-1.24.0]# ls /apps/nginx/sbin/nginx nginx.122
#检测,配置文件可用,版本己更新[root@ubuntu nginx-1.24.0]# nginx -tnginx: the configuration file /apps/nginx/conf/nginx.conf syntax is oknginx: configuration file /apps/nginx/conf/nginx.conf test is successful[root@ubuntu nginx-1.24.0]# nginx -vnginx version: nginx/1.24.0
#当前进程是旧版本的进程[root@ubuntu nginx-1.24.0]# ps auxf | grep nginxroot 6757 0.0 0.1 10164 3116 ? Ss 21:50 0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.confnginx 88774 0.0 0.1 10916 3688 ? S 22:30 0:00 \_ nginx: worker processnginx 88775 0.0 0.1 10916 3688 ? S 22:30 0:00 \_ nginx: worker process
[root@ubuntu nginx-1.24.0]# curl 127.1 -IHTTP/1.1 200 OKServer: nginx/1.22.1 #查看响应头,是旧版本的 NginxDate: Sat, 20 Jan 2025 14:52:50 GMTContent-Type: text/htmlContent-Length: 615Last-Modified: Sat, 20 Jan 2025 13:43:25 GMTConnection: keep-aliveETag: "65abcdfd-267"Accept-Ranges: bytes
#在服务端创建文件[root@ubuntu nginx-1.24.0]# dd if=/dev/zero of=/apps/nginx/html/test.img bs=1Mcount=100100+0 records in100+0 records out104857600 bytes (105 MB, 100 MiB) copied, 0.0550297 s, 1.9 GB/s
#向master 进程发送信号[root@ubuntu nginx-1.24.0]# kill -USR2 6757
#生成了新的master 进程 88856,该进程下有两个 worker 进程,分别是 88857,88858[root@ubuntu nginx-1.24.0]# ps auxf | grep nginxroot 6757 0.0 0.1 10164 3116 ? Ss 21:50 0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.confnginx 88774 0.0 0.1 10916 3688 ? S 22:30 0:00 \_ nginx: worker processnginx 88775 0.0 0.1 10916 3688 ? S 22:30 0:00 \_ nginx: worker processroot 88856 0.0 0.3 10176 6404 ? S 23:00 0:00 \_ nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.confnginx 88857 0.0 0.1 10912 3688 ? S 23:00 0:00 \_nginx: worker processnginx 88858 0.0 0.1 10912 3688 ? S 23:00 0:00 \_nginx: worker process
#生成了新的PID文件[root@ubuntu nginx-1.24.0]# ls -lh /apps/nginx/run/total 8.0K-rw-r--r-- 1 root root 6 Jan 20 23:00 nginx.pid-rw-r--r-- 1 root root 5 Jan 20 21:50 nginx.pid.oldbin
[root@ubuntu nginx-1.24.0]# cat /apps/nginx/run/nginx.pid #新的 master 进程 PID88856[root@ubuntu nginx-1.24.0]# cat /apps/nginx/run/nginx.pid.oldbin #旧的 master 进程 PID6757
#现在访问还是旧版本提供服务[root@ubuntu nginx-1.24.0]# curl 127.1 -IHTTP/1.1 200 OKServer: nginx/1.22.1Date: Sat, 20 Jan 2025 15:03:24 GMTContent-Type: text/htmlContent-Length: 615Last-Modified: Sat, 20 Jan 2025 13:43:25 GMTConnection: keep-aliveETag: "65abcdfd-267"Accept-Ranges: bytes
此时不关机保存一份快照,用于后续测试回滚
#客户端限速下载[root@ubuntu ~]# wget --limit-rate=102400 http://10.0.0.208/test.img
#服务端继续发送信号,此信号会关闭旧的 woker 进程,新请求交由新的 worker 进程处理[root@ubuntu nginx-1.24.0]# kill -WINCH 6757
#查看进程,旧的 master 进程下还有一个 worker 进程,用于维持下载连接[root@ubuntu nginx-1.24.0]# ps auxf | grep nginxroot 6757 0.0 0.1 10164 3116 ? Ss 21:50 0:00 nginx: master process /apps/nginx/sbin/nginx -/apps/nginx/conf/nginx.confnginx 88774 0.0 0.1 10916 3688 ? S 22:30 0:00 \_ nginx: worker process is shutting downroot 88856 0.0 0.3 10176 6404 ? S 23:00 0:00 \_ nginx: master process /apps/nginx/sbin/nginx -/apps/nginx/conf/nginx.confnginx 88857 0.0 0.1 10912 3688 ? S 23:00 0:00 \_nginx: worker processnginx 88858 0.0 0.1 10912 3688 ? S 23:00 0:00 \_nginx: worker process
#新的连接己经由新版本来响应了[root@ubuntu nginx-1.24.0]# curl 127.1 -IHTTP/1.1 200 OKServer: nginx/1.24.0DateSat20 Jan 2025 15:32:23 GMTContent-Type: text/htmlContent-Length615Last-ModifiedSat20 Jan 2025 13:43:25 GMTConnection: keep-aliveETag"65abcdfd-267"Accept-Ranges: bytes
#下载请求结束后,旧的 woker 进程全部退出[root@ubuntu nginx-1.24.0]# ps auxf | grep nginxroot 6757 0.0 0.1 10164 3116 ? Ss 21:50 0:00 nginx: master process /apps/nginx/sbin/nginx -/apps/nginx/conf/nginx.confroot 88856 0.0 0.3 10176 6404 ? S 23:00 0:00 \_ nginx: master process /apps/nginx/sbin/nginx -/apps/nginx/conf/nginx.confnginx 88857 0.0 0.2 10912 4248 ? S 23:00 0:00 \_nginx: worker processnginx 88858 0.0 0.1 10912 3688 ? S 23:00 0:00 \_nginx: worker process
#观察一段时间后,如果业务没有问题,则可以继续发送信号,退出旧的 master 进程,至此升级完成[root@ubuntu nginx-1.24.0]# kill -QUIT 6757[root@ubuntu nginx-1.24.0]# ps auxf | grep nginxroot 88856 0.0 0.3 10176 6404 ? S 23:00 0:00 nginx: master process /apps/nginx/sbin/nginx -/apps/nginx/conf/nginx.confnginx 88857 0.0 0.2 10912 4248 ? S 23:00 0:00 \_ nginx: worker processnginx 88858 0.0 0.1 10912 3688 ? S 23:00 0:00 \_ nginx: worker process
#还原快照,测试回滚[root@ubuntu nginx-1.24.0]# ps auxf | grep nginxroot 6757 0.0 0.1 10164 3116 ? Ss 22:00 0:00 nginx: master process /apps/nginx/sbin/nginx -/apps/nginx/conf/nginx.confnginx 88774 0.0 0.1 10916 3688 ? S 22:39 0:00 \_ nginx: worker processnginx 88775 0.0 0.1 10916 3688 ? S 22:39 0:00 \_ nginx: worker processroot 88856 0.0 0.3 10176 6404 ? S 23:10 0:00 \_ nginx: master process /apps/nginx/sbin/nginx -/apps/nginx/conf/nginx.confnginx 88857 0.0 0.1 10912 3688 ? S 23:10 0:00 \_nginx: worker processnginx 88858 0.0 0.1 10912 3688 ? S 23:10 0:00 \_nginx: worker process
#发送信号,将新请求交由新版 worker 进程处理[root@ubuntu nginx-1.24.0]# kill -WINCH 6757[root@ubuntu nginx-1.24.0]# ps auxf | grep nginxroot 6757 0.0 0.1 10164 3116 ? Ss 22:00 0:00 nginx: master process /apps/nginx/sbin/nginx -/apps/nginx/conf/nginx.confroot 88856 0.0 0.3 10176 6404 ? S 23:10 0:00 \_ nginx: master process /apps/nginx/sbin/nginx -/apps/nginx/conf/nginx.confnginx 88857 0.0 0.1 10912 3688 ? S 23:10 0:00 \_nginx: worker processnginx 88858 0.0 0.1 10912 3688 ? S 23:10 0:00 \_nginx: worker process
#新版响应请求[root@ubuntu nginx-1.24.0]# curl 127.1 -IHTTP/1.1 200 OKServer: nginx/1.24.0DateSat20 Jan 2025 15:49:05 GMTContent-Type: text/htmlContent-Length615Last-ModifiedSat20 Jan 2025 13:43:25 GMTConnection: keep-aliveETag"65abcdfd-267"Accept-Ranges: bytes
#观察业务,需要回滚#先还原二进制文件[root@ubuntu nginx-1.24.0]# ls -/apps/nginx/sbin/total 11540-rwxr-xr-1 root root 5929488 Jan 20 22:51 nginx*-rwxr-xr-1 nginx nginx 5884528 Jan 20 21:43 nginx.122*
[root@ubuntu nginx-1.24.0]# mv /apps/nginx/sbin/nginx{,.124} #备份当前使用的[root@ubuntu nginx-1.24.0]# mv /apps/nginx/sbin/nginx{.122,} #还原旧版[root@ubuntu nginx-1.24.0]# ls -/apps/nginx/sbin/total 11540-rwxr-xr-1 nginx nginx 5884528 Jan 20 21:43 nginx-rwxr-xr-1 root root 5929488 Jan 20 22:51 nginx.124
#还原回来了[root@ubuntu nginx-1.24.0]# nginx -vnginx version: nginx/1.22.1[root@ubuntu nginx-1.24.0]# nginx -tnginx: the configuration file /apps/nginx/conf/nginx.conf syntax is oknginx: configuration file /apps/nginx/conf/nginx.conf test is successful
#发送信号,拉起旧的 worker 进程[root@ubuntu nginx-1.24.0]# kill -HUP 6757[root@ubuntu nginx-1.24.0]# ps auxf | grep nginxroot 6757 0.0 0.1 10164 3116 ? Ss 22:15 0:00 nginx: master process /apps/nginx/sbin/nginx -/apps/nginx/conf/nginx.confroot 88856 0.0 0.3 10176 6404 ? S 23:25 0:00 \_ nginx: master process /apps/nginx/sbin/nginx -/apps/nginx/conf/nginx.confnginx 88857 0.0 0.2 10912 4248 ? S 23:25 0:00 | \_nginx: worker processnginx 88858 0.0 0.1 10912 3688 ? S 23:25 0:00 | \_nginx: worker processnginx 89179 0.0 0.1 10916 3680 ? S 23:58 0:00 \_ nginx: worker processnginx 89180 0.0 0.1 10916 3632 ? S 23:58 0:00 \_ nginx: worker process
#此时请求还是由新的 worker 进程响应[root@ubuntu nginx-1.24.0]# curl 127.1 -IHTTP/1.1 200 OKServer: nginx/1.24.0DateSat20 Jan 2025 16:00:01 GMTContent-Type: text/htmlContent-Length615Last-ModifiedSat20 Jan 2025 13:43:25 GMTConnection: keep-aliveETag"65abcdfd-267"Accept-Ranges: bytes
#继续发送信号,优雅的退出新版的 master 进程[root@ubuntu nginx-1.24.0]# kill -QUIT 88856
#己经还原回去了[root@ubuntu nginx-1.24.0]# ps auxf | grep nginxroot 6757 0.0 0.1 10164 3116 ? Ss Jan20 0:00 nginx: master process /apps/nginx/sbin/nginx -/apps/nginx/conf/nginx.confnginx 89179 0.0 0.1 10916 3680 ? S Jan20 0:00 \_ nginx: worker processnginx 89180 0.0 0.1 10916 3632 ? S Jan20 0:00 \_ nginx: worker process
#测试[root@ubuntu nginx-1.24.0]# curl 127.1 -IHTTP/1.1 200 OKServer: nginx/1.22.1DateSat20 Jan 2025 16:05:18 GMTContent-Type: text/htmlContent-Length615Last-ModifiedSat20 Jan 2025 13:43:25 GMTConnection: keep-aliveETag"65abcdfd-267"Accept-Ranges: bytes

如果是用 yum/apt 安装的nginx ,使用 yum/apt 升级时,无法实现平滑升级,但可以在一台新的机器上安装新版,然后再平移新版的二进制文件到原机器,但要注意依赖库的兼容性和配置文件的兼容性


— END —


阅读原文:原文链接


该文章在 2025/7/1 22:58:46 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved