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/
1.2 Nginx 架构和工作模型
Nginx 整体架构
Nginx 工作模型
在Nginx中,Master进程和Worker进程分别承担不同的角色,共同协作以提供高性能的服务
Master 进程
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 的核心模块主要有三部分,分别是
其中 HTTP 模块又包含以下几部分
第三方模块(HTTP Modules)
Nginx提供了一套模块化的架构,允许开发者编写自定义的模块来扩展功能。这些第三方模块可以包括但不限于以下几类
https://nginx.org/en/docs/
1.4 Nginx 版本和安装
1.4.1 Nginx 版本
Nginx 官方将 Nginx 分为三个类型的版本,分别是 Mainline,Stable,Legacy
Mainline(主线版)
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 安装的时候,只能安装操作系统发行版厂商已经提交到仓库中的版本,如果需要安装更新的版本或历史版本,可自行配置官方仓库,然后进行安装
[root@ubuntu ~]
[root@rocky ~]
[root@ubuntu ~]
[root@ubuntu ~]
[root@ubuntu ~]
[root@ubuntu ~]
nginx nginx-common nginx-core
[root@ubuntu ~]
/.
/usr
/usr/sbin
/usr/sbin/nginx
......
[root@ubuntu ~]
[root@ubuntu ~]
[root@ubuntu ~]
[root@ubuntu ~]
[root@ubuntu ~]
nginx version: nginx/1.18.0 (Ubuntu)
[root@ubuntu ~]
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 16
drwxr-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 -v
nginx 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 nginx
Unit nginx.service could not be found.
[root@ubuntu ~]# ps aux | grep nginx
#直接启动nginx,一个master进程,一个worker进程
[root@ubuntu ~]# nginx
[root@ubuntu ~]# ps aux | grep nginx
[root@ubuntu ~]
[root@ubuntu ~]
[root@ubuntu ~]
[root@ubuntu ~]
[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/run/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
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
[root@ubuntu ~]
pid /apps/nginx/run/nginx.pid;
[root@ubuntu ~]
[root@ubuntu ~]
[root@ubuntu ~]
[root@ubuntu ~]
[root@ubuntu ~]
No manual entry for nginx
[root@ubuntu ~]
[root@ubuntu ~]
[root@ubuntu ~]
nginx: /usr/sbin/nginx /usr/share/man/man8/nginx.8
1.5 Nginx 命令和信号
[root@ubuntu ~]
nginx version: nginx/1.18.0 (Ubuntu)
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
?|-h
v
V
t
T
q
s signal
p prefix
c filename
g directive
stop
quit
reopen
reload
SIGUSR2
SIGWINCH
#检查配置文件语法,并测试配置文件
[root@ubuntu ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@ubuntu ~]# echo $?
0
#检查配置文件语法,并测试配置文件,仅输出错误信息
[root@ubuntu ~]# nginx -t -q
[root@ubuntu ~]# echo $?
0
[root@ubuntu ~]
user www-data;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
[root@ubuntu ~]
[root@ubuntu ~]
发送信号
[root@ubuntu ~]
[root@ubuntu ~]
[root@ubuntu ~]
[root@ubuntu ~]
[root@ubuntu ~]
[root@ubuntu ~]
curl: (7) Failed to connect to 127.0.0.1 port 80 after 0 ms: Connection refused
[root@ubuntu ~]
#reload信号
#当前一个master,两个worker
[root@ubuntu ~]# ps aux | grep nginx
#客户端开启一个下载进程
#修改配置文件
[root@ubuntu ~]# cat /etc/nginx/nginx.conf
user 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 在更新时保持对服务的连续响应,避免中断用户的请求,这对于具有高可用性要求的生产环境非常重要,然而,需要注意的是,平滑升级并不适用于所有场景,特别是在某些配置或软件更改可能导致不兼容性问题的情况下,在进行平滑升级之前,建议先在测试环境中进行充分的测试
平滑升级通常包括以下步骤:
#查看当前使用的版本和编译选项
[root@ubuntu ~]# nginx -V
nginx version: nginx/1.22.1
built by gcc 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
built with OpenSSL 3.0.2 15 Mar 2022
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
#修改当前配置文件,至少保证两个worker进程,便于测试
[root@ubuntu ~]# cat /apps/nginx/conf/nginx.conf
worker_processes 2;
[root@ubuntu ~]# nginx -s reload
[root@ubuntu ~]# ps auxf | grep nginx
root 6757 0.0 0.1 10164 3116 ? Ss 21:50 0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx 88774 0.0 0.1 10916 3688 ? S 22:30 0:00 \_ nginx: worker process
nginx 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 -v
nginx version: nginx/1.24.0
#现在正在使用的
[root@ubuntu nginx-1.24.0]# nginx -v
nginx 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 -v
nginx 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 -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@ubuntu nginx-1.24.0]# nginx -v
nginx version: nginx/1.24.0
#当前进程是旧版本的进程
[root@ubuntu nginx-1.24.0]# ps auxf | grep nginx
root 6757 0.0 0.1 10164 3116 ? Ss 21:50 0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx 88774 0.0 0.1 10916 3688 ? S 22:30 0:00 \_ nginx: worker process
nginx 88775 0.0 0.1 10916 3688 ? S 22:30 0:00 \_ nginx: worker process
[root@ubuntu nginx-1.24.0]# curl 127.1 -I
HTTP/1.1 200 OK
Server: nginx/1.22.1 #查看响应头,是旧版本的 Nginx
Date: Sat, 20 Jan 2025 14:52:50 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Sat, 20 Jan 2025 13:43:25 GMT
Connection: keep-alive
ETag: "65abcdfd-267"
Accept-Ranges: bytes
#在服务端创建文件
[root@ubuntu nginx-1.24.0]# dd if=/dev/zero of=/apps/nginx/html/test.img bs=1M
count=100
100+0 records in
100+0 records out
104857600 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 nginx
root 6757 0.0 0.1 10164 3116 ? Ss 21:50 0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx 88774 0.0 0.1 10916 3688 ? S 22:30 0:00 \_ nginx: worker process
nginx 88775 0.0 0.1 10916 3688 ? S 22:30 0:00 \_ nginx: worker process
root 88856 0.0 0.3 10176 6404 ? S 23:00 0:00 \_ nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx 88857 0.0 0.1 10912 3688 ? S 23:00 0:00 \_nginx: worker process
nginx 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 进程 PID
88856
[root@ubuntu nginx-1.24.0]# cat /apps/nginx/run/nginx.pid.oldbin #旧的 master 进程 PID
6757
#现在访问还是旧版本提供服务
[root@ubuntu nginx-1.24.0]# curl 127.1 -I
HTTP/1.1 200 OK
Server: nginx/1.22.1
Date: Sat, 20 Jan 2025 15:03:24 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Sat, 20 Jan 2025 13:43:25 GMT
Connection: keep-alive
ETag: "65abcdfd-267"
Accept-Ranges: bytes
#客户端限速下载
[root@ubuntu ~]# wget --limit-rate=102400 http:
#服务端继续发送信号,此信号会关闭旧的 woker 进程,新请求交由新的 worker 进程处理
[root@ubuntu nginx-1.24.0]# kill -WINCH 6757
#查看进程,旧的 master 进程下还有一个 worker 进程,用于维持下载连接
[root@ubuntu nginx-1.24.0]# ps auxf | grep nginx
root 6757 0.0 0.1 10164 3116 ? Ss 21:50 0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx 88774 0.0 0.1 10916 3688 ? S 22:30 0:00 \_ nginx: worker process is shutting down
root 88856 0.0 0.3 10176 6404 ? S 23:00 0:00 \_ nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx 88857 0.0 0.1 10912 3688 ? S 23:00 0:00 \_nginx: worker process
nginx 88858 0.0 0.1 10912 3688 ? S 23:00 0:00 \_nginx: worker process
#新的连接己经由新版本来响应了
[root@ubuntu nginx-1.24.0]# curl 127.1 -I
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Sat, 20 Jan 2025 15:32:23 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Sat, 20 Jan 2025 13:43:25 GMT
Connection: keep-alive
ETag: "65abcdfd-267"
Accept-Ranges: bytes
#下载请求结束后,旧的 woker 进程全部退出
[root@ubuntu nginx-1.24.0]# ps auxf | grep nginx
root 6757 0.0 0.1 10164 3116 ? Ss 21:50 0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
root 88856 0.0 0.3 10176 6404 ? S 23:00 0:00 \_ nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx 88857 0.0 0.2 10912 4248 ? S 23:00 0:00 \_nginx: worker process
nginx 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 nginx
root 88856 0.0 0.3 10176 6404 ? S 23:00 0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx 88857 0.0 0.2 10912 4248 ? S 23:00 0:00 \_ nginx: worker process
nginx 88858 0.0 0.1 10912 3688 ? S 23:00 0:00 \_ nginx: worker process
#还原快照,测试回滚
[root@ubuntu nginx-1.24.0]# ps auxf | grep nginx
root 6757 0.0 0.1 10164 3116 ? Ss 22:00 0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx 88774 0.0 0.1 10916 3688 ? S 22:39 0:00 \_ nginx: worker process
nginx 88775 0.0 0.1 10916 3688 ? S 22:39 0:00 \_ nginx: worker process
root 88856 0.0 0.3 10176 6404 ? S 23:10 0:00 \_ nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx 88857 0.0 0.1 10912 3688 ? S 23:10 0:00 \_nginx: worker process
nginx 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 nginx
root 6757 0.0 0.1 10164 3116 ? Ss 22:00 0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
root 88856 0.0 0.3 10176 6404 ? S 23:10 0:00 \_ nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx 88857 0.0 0.1 10912 3688 ? S 23:10 0:00 \_nginx: worker process
nginx 88858 0.0 0.1 10912 3688 ? S 23:10 0:00 \_nginx: worker process
#新版响应请求
[root@ubuntu nginx-1.24.0]# curl 127.1 -I
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Sat, 20 Jan 2025 15:49:05 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Sat, 20 Jan 2025 13:43:25 GMT
Connection: keep-alive
ETag: "65abcdfd-267"
Accept-Ranges: bytes
#观察业务,需要回滚
#先还原二进制文件
[root@ubuntu nginx-1.24.0]# ls -l /apps/nginx/sbin/
total 11540
-rwxr-xr-x 1 root root 5929488 Jan 20 22:51 nginx*
-rwxr-xr-x 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 -l /apps/nginx/sbin/
total 11540
-rwxr-xr-x 1 nginx nginx 5884528 Jan 20 21:43 nginx
-rwxr-xr-x 1 root root 5929488 Jan 20 22:51 nginx.124
#还原回来了
[root@ubuntu nginx-1.24.0]# nginx -v
nginx version: nginx/1.22.1
[root@ubuntu nginx-1.24.0]# nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: 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 nginx
root 6757 0.0 0.1 10164 3116 ? Ss 22:15 0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
root 88856 0.0 0.3 10176 6404 ? S 23:25 0:00 \_ nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx 88857 0.0 0.2 10912 4248 ? S 23:25 0:00 | \_nginx: worker process
nginx 88858 0.0 0.1 10912 3688 ? S 23:25 0:00 | \_nginx: worker process
nginx 89179 0.0 0.1 10916 3680 ? S 23:58 0:00 \_ nginx: worker process
nginx 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 -I
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Sat, 20 Jan 2025 16:00:01 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Sat, 20 Jan 2025 13:43:25 GMT
Connection: keep-alive
ETag: "65abcdfd-267"
Accept-Ranges: bytes
#继续发送信号,优雅的退出新版的 master 进程
[root@ubuntu nginx-1.24.0]# kill -QUIT 88856
#己经还原回去了
[root@ubuntu nginx-1.24.0]# ps auxf | grep nginx
root 6757 0.0 0.1 10164 3116 ? Ss Jan20 0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx 89179 0.0 0.1 10916 3680 ? S Jan20 0:00 \_ nginx: worker process
nginx 89180 0.0 0.1 10916 3632 ? S Jan20 0:00 \_ nginx: worker process
#测试
[root@ubuntu nginx-1.24.0]# curl 127.1 -I
HTTP/1.1 200 OK
Server: nginx/1.22.1
Date: Sat, 20 Jan 2025 16:05:18 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Sat, 20 Jan 2025 13:43:25 GMT
Connection: keep-alive
ETag: "65abcdfd-267"
Accept-Ranges: bytes
如果是用 yum/apt 安装的nginx ,使用 yum/apt 升级时,无法实现平滑升级,但可以在一台新的机器上安装新版,然后再平移新版的二进制文件到原机器,但要注意依赖库的兼容性和配置文件的兼容性
— END —
阅读原文:原文链接
该文章在 2025/7/1 22:58:46 编辑过