Nginx云计算大数据——安装AND版本升级(普通升级+平滑升级+失败回滚)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

官方下载地址:nginx.org/en/download.html

一、Nginx一键安装

1.1基础环境,关闭防火墙与SELinux

为避免端口访问限制,脚本会临时关闭防火墙并禁用SELinux:

bash 复制代码
关闭防火墙与SELinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0 /getenforce
vim /etc/sysconfig/selinux

1.2 安装编译依赖

安装编译Nginx所需的开发工具和库:

bash 复制代码
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel

1.3创建Nginx运行用户

为Nginx创建一个无登录权限的系统用户,提升安全性:

bash 复制代码
useradd -M -s /sbin/nologin nginx

1.4编译安装Nginx

bash 复制代码
cd /opt
tar zxvf nginx-1.20.2.tar.gz
bash 复制代码
cd nginx-1.20.2/
./configure \
--prefix=/usr/local/nginx \							#指定nginx的安装路径
--user=nginx \										#指定用户名
--group=nginx \										#指定组名
--with-http_stub_status_module \  
--with-http_ssl_module						   #启用 http_stub_status_module 模块以支持状态统计
bash 复制代码
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
bash 复制代码
make && make install

1.5创建软链接

bash 复制代码
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/		#让系统识别nginx的操作命令

ps补充创建软链接的目的:

bash 复制代码
创建软链接(符号链接)的核心目的是灵活管理文件 / 目录的访问关系,具体用途包括:
1. 简化文件 / 程序的访问路径
将深层目录中的文件 / 可执行程序链接到系统默认的 "快捷访问目录"(如/usr/bin、~),避免每次输入长路径。示例:
bash
运行
# 将/usr/local/nginx/sbin/nginx链接到/usr/bin,直接执行nginx即可启动服务
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
2. 统一管理软件版本
当同一软件存在多个版本时,用软链接指向当前活跃版本,切换版本只需修改软链接的指向,无需修改依赖该软件的配置 / 脚本。示例:
bash
运行
# 假设存在python3.8和python3.10,用软链接python3指向当前版本
ln -s /usr/bin/python3.10 /usr/bin/python3
# 切换版本时仅需重新创建链接
ln -sf /usr/bin/python3.8 /usr/bin/python3

1.6.检查、启动、重启、停止 nginx服务

nginx -t #检查配置文件是否配置正确

1.7添加 Nginx 系统服务

bash 复制代码
方法一:
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: 35 99 20    // 这是固定格式,2345表示运行级别,之后为开机执行顺序和关机执行顺序
#description:Nginx Service Control Script    //这也是必须的 
COM="/usr/local/nginx/sbin/nginx" 
PID="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
  $COM
;;

stop)
  kill -s QUIT $(cat $PID)
;;

restart)
  $0 stop
  $0 start
;;

reload)
  kill -s HUP $(cat $PID)
;;

*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1

esac
exit 0


chmod +x /etc/init.d/nginx
chkconfig --add nginx							#添加为系统服务



service   nginx   start|stop|restart|reload
系统服务 服务名称 启动模式

方法二:
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
---------------------------------------------------------
[Unit]:服务的说明
Description:描述服务
After:依赖,当依赖的服务启动之后再启动自定义的服务

[Service]服务运行参数的设置
Type=forking是后台运行的形式,使用此启动类型应同时指定
PIDFile以便systemd能够跟踪服务的主进程。
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径

[Install]服务安装的相关设置,可设置为多用户
---------------------------------------------------------

chmod 754 /lib/systemd/system/nginx.service

修改 Nginx 的 systemd 服务配置文件的权限

bash 复制代码
systemctl start nginx.service
systemctl enable nginx.service

二、升级

2.1 确认当前 Nginx 信息

bash 复制代码
# 1. 查看当前 Nginx 版本
nginx -v  # 简洁版本信息,如 nginx version: nginx/1.20.0
nginx -V  # 完整信息(含编译参数),重点记录 --prefix、--with-xxx 等参数
bash 复制代码
# 2. 查看 Nginx 运行状态
systemctl status nginx  # 系统服务管理(CentOS/RHEL 7+、Ubuntu 16.04+)
# 或通过进程查看
ps -aux | grep nginx  # 区分主进程(master)和工作进程(worker)
bash 复制代码
# 强制批量杀死
pkill -9 nginx

2.2 下载目标版本 Nginx

bash 复制代码
# 进入源码存放目录(如 /opt)
cd /opt
# 下载源码包
wget https://nginx.org/download/nginx-1.22.0.tar.gz
# 解压
tar -zxvf nginx-1.22.0.tar.gz
cd nginx-1.22.0

2.3 备份关键文件

升级前必须备份 配置文件 和 旧版本二进制文件,防止升级失败后无法回滚:

bash 复制代码
# 1. 备份 Nginx 配置文件(默认路径为 --prefix 指定的 conf 目录)
cp -r /usr/local/nginx/conf /usr/local/nginx/conf_bak_$(date +%Y%m%d)

/usr/local/nginx/conf_bak_ ( d a t e + (date +%Y%m%d) 目标路径:备份后的目录名,其中 (date+(date +%Y%m%d)会自动生成 "年月日" 格式的后缀(如 20251218),避免备份文件重名

bash 复制代码
# 2. 备份 Nginx 日志文件(可选,避免日志丢失)
cp -r /usr/local/nginx/logs /usr/local/nginx/logs_bak_$(date +%Y%m%d)
bash 复制代码
# 3. 备份旧版本二进制文件(后续会用到)
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old

三、方案一:普通升级(停止服务升级)

先停止旧版本 Nginx,再替换二进制文件并启动新版本。操作简单,但会导致服务短暂中断(通常几秒到几十秒),适合非核心业务或可接受短时间停机的场景。具体操作步骤如下:

3.1 停止当前 Nginx 服务

bash 复制代码
# 方式1:通过系统服务停止(推荐,兼容 systemd)
systemctl stop nginx

# 方式2:通过 Nginx 自身命令停止
nginx -s stop  # 快速停止(可能中断正在处理的请求)
# 或
nginx -s quit  # 优雅停止(等待所有请求处理完成后停止)

3.2 编译新版本 Nginx

编译参数必须与旧版本一致(参考第一步 nginx -V 输出的参数),否则可能导致配置不兼容或功能缺失:

bash 复制代码
# 进入解压后的新版本目录
cd /opt/nginx-1.22.0
   
# 执行 configure 配置(参数与旧版本保持一致)
./configure \
--prefix=/usr/local/nginx \  # 安装路径(与旧版本相同)
--user=nginx \               # 运行用户
--group=nginx \              # 运行用户组
--with-http_stub_status_module \  # 状态监控模块
--with-http_ssl_module        # HTTPS 模块(若旧版本有则保留)

#无注释版:
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
bash 复制代码
# 编译(无需执行 make install,避免覆盖配置文件)
make

3.3 替换二进制文件并启动

编译完成后,新版本二进制文件会生成在 objs/nginx 路径,将其复制到旧版本路径:

bash 复制代码
# 复制新版本二进制文件到运行目录
cp objs/nginx /usr/local/nginx/sbin/
bash 复制代码
# 启动新版本 Nginx
systemctl start nginx
# 或
nginx
bash 复制代码
# 查看版本(应显示目标版本 1.22.0)
nginx -v
   
# 查看服务状态(确保为 active (running))
systemctl status nginx
   
# 访问测试(若有 Web 服务,通过浏览器或 curl 验证)
curl http://localhost

四、方案二:平滑升级(无感知不中断)

不停止旧版本主进程,通过信号控制逐步替换工作进程

整个过程中服务不中断,新请求由新版本处理,旧请求处理完成后旧进程退出,适合生产环境(尤其是核心业务)。

4.1 核心原理:Nginx 信号机制

Nginx 主进程(master)通过接收特定信号实现进程管理,平滑升级依赖以下 3 个关键信号:

USR2:主进程接收到后,会启动一个新版本的主进程,并继承旧版本的监听端口和配置;
WINCH:旧版本主进程接收到后,会逐步关闭所有旧版本工作进程(worker);
QUIT:优雅关闭主进程(等待所有工作进程结束后退出)。

4.2 操作步骤

4.2.1 前期准备(同方案一)

完成版本确认、源码下载、文件备份和新版本编译(步骤与方案一的 1~2 一致,确保 make 编译完成)。(到3.2)

4.2.2 复制新版本二进制文件

直接替换旧版本二进制文件(此时旧进程仍在运行,不影响服务)

bash 复制代码
# 备份旧版本二进制文件(若未备份可执行)
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old

# 复制新版本二进制文件(同方案一)
cp /opt/nginx-1.22.0/objs/nginx /usr/local/nginx/sbin/nginx

4.2.3 发送信号启动新版本主进程

先找到旧版本 Nginx 主进程的 PID(通过 ps -aux | grep nginx 查看,通常是第一个 nginx 进程):

bash 复制代码
# 1. 查找旧版本主进程 PID(示例 PID 为 4787)
ps -aux | grep nginx
# 输出示例:root  4787  0.0  0.0  46008  1128 ? Ss   18:03   0:00 nginx: master process /usr/local/nginx/sbin/nginx
bash 复制代码
# 2. 发送 USR2 信号,启动新版本主进程
kill -USR2 4787
   
# 3. 再次查看进程,会发现两个主进程(旧 4787 + 新 PID,如 20345)
ps -aux | grep nginx

4.2.4 逐步关闭旧版本工作进程

新版本主进程启动后,会自动创建新版本工作进程,此时需要关闭旧版本工作进程:

bash 复制代码
# 发送 WINCH 信号给旧版本主进程,关闭旧工作进程
kill -WINCH 11162

# 查看进程:旧工作进程会逐步退出,仅剩旧主进程(4787)和新主进程+新工作进程
ps -aux | grep nginx

4.2.5 验证新版本并收尾

确认新版本正常运行后,可彻底关闭旧版本主进程(若出现问题,可通过旧主进程回滚):

bash 复制代码
# 1. 验证新版本(此时 nginx -V 已指向新版本)
nginx -V  # 应显示 1.22.0,且编译参数正确

# 2. 访问测试(通过浏览器或 curl 确认服务正常)
curl http://localhost
   
# 3. 彻底关闭旧版本主进程(升级无问题后执行)
kill -s QUIT 11162
   
# 4. 再次查看进程:仅保留新版本主进程和工作进程
ps -aux | grep nginx

五、升级失败回滚方案

无论哪种升级方式,都需提前准备回滚方案,确保出现问题时能快速恢复服务。

5.1 普通升级回滚

bash 复制代码
若启动新版本后服务异常,直接恢复旧版本二进制文件并重启:

# 1. 停止新版本 Nginx
systemctl stop nginx

# 2. 恢复旧版本二进制文件
mv /usr/local/nginx/sbin/nginx_old /usr/local/nginx/sbin/nginx

# 3. 启动旧版本 Nginx
systemctl start nginx

# 4. 验证回滚结果
nginx -v  # 应显示旧版本

5.2 平滑升级回滚

bash 复制代码
# 1. 发送 HUP 信号给旧版本主进程,重启旧版本工作进程
kill -s HUP 旧主进程PID(如 11162)

# 2. 发送 QUIT 信号给新版本主进程,关闭新版本
kill -s QUIT 新主进程PID(如 11187)

# 3. 恢复旧版本二进制文件
mv /usr/local/nginx/sbin/nginx_old /usr/local/nginx/sbin/nginx

# 4. 验证回滚结果
nginx -v  # 应显示旧版本
ps -aux | grep nginx  # 仅保留旧版本进程

六、常见问题与注意事项

编译参数不一致导致启动失败

问题现象:nginx -t 报配置错误,或启动后服务异常。

解决:必须确保新版本 ./configure 参数与旧版本完全一致(参考 nginx -V 输出),缺失模块会导致配置不兼容。

权限问题导致无法启动

问题现象:启动时提示 permission denied。

解决:检查 nginx 二进制文件权限(建议 chmod 755 /usr/local/nginx/sbin/nginx),且运行用户(如 nginx)对日志目录、配置目录有读写权限。

平滑升级后旧主进程无法关闭

问题现象:执行 kill -QUIT 旧主进程PID 后,旧主进程仍存在。

解决:先检查是否有未结束的旧工作进程(ps -aux| grep nginx),等待其处理完请求后自动退出,或手动发送 TERM 信号强制关闭(kill -s TERM 旧工作进程PID)。

升级前务必测试配置

替换二进制文件后,启动前执行 nginx -t 检查配置文件是否兼容新版本,避免因配置语法变化导致启动失败:

总结:两种升级方案对比

对比维度 普通升级(停止服务) 平滑升级(无感知)

服务中断 是(短暂中断) 否(完全无感知)

操作复杂度 低(步骤少) 中(需管理信号)

适用场景 非核心业务、测试环境 生产环境、核心业务

回滚难度 低(直接恢复文件) 中(需控制进程)

无论选择哪种方案,升级前备份、升级中验证、升级后监控 都是必不可少的环节。通过本文的操作步骤,你可以根据业务场景灵活选择升级方式,确保 Nginx 版本升级安全、高效。

相关推荐
xushichang123_4 分钟前
如何观看 2026 亚马逊云科技中国峰会全场主题演讲与技术分论坛内容?
大数据·人工智能
招财小梗26 分钟前
AI矩阵获客,品牌连锁落地有啥方案?
大数据·人工智能·矩阵
黎子越44 分钟前
大模型基础名词概念
大数据
zandy10111 小时前
主流 AI Agent搜索Skill推荐及高阶选型指南
大数据·人工智能
跨境卫士苏苏1 小时前
2026年做跨境电商,TikTok美区半托管这3个品类正在严查,第2个很多新手还在铺货
大数据·人工智能·跨境电商·营销策略
GIS数据转换器1 小时前
村镇无人机物流配送与跨域监测一体化平台
大数据·运维·人工智能·科技·无人机
骇客野人1 小时前
基于Nginx+Eureka+Apollo+Jenkins+SpringBoot Web系统分布式部署方案
nginx·eureka·jenkins
知识燃料2 小时前
企业技术决策者落地 AI Agent 体系,AWS 中国峰会有哪些战略与工程内容可看?
大数据·人工智能
TDengine (老段)2 小时前
TDengine 第三方工具 — Telegraf、Kafka Connect、Flink、Spark
大数据·数据库·物联网·flink·kafka·时序数据库·tdengine
guwentian10 小时前
Git Worktree 实战:用并行多 Agent 把开发提速 N 倍
大数据·git·elasticsearch·wroktree