我这里会描述我详细操作过程,比较啰嗦,包括遇到问题的解决。请耐心查阅。
升级背景:系统安全漏洞扫描,扫描到当前服务器安装的1.21.5版本nginx存在一系列安全漏洞。经过了解安全漏洞扫描机制,大部分都是根据版本号来的,如果只是打补丁挨个修复,还是存在被扫描出漏洞的可能。经调研,将nginx升级到1.30以上版本可以通过第三方安全漏洞扫描。这里选择了1.30.3版本

一、前期准备:记录与备份
因为是生产环境,一定要谨慎。这里需要先了解清楚系统环境,当前版本以及数据备份。
我的系统环境:
-
当前系统:麒麟 V10(内核 4.19.90-24.4.v2101.ky10.x86_64)
-
当前 NGINX 版本:1.21.5
-
目标版本:1.30.3
-
升级方式:使用 nginx.org 为 CentOS/RHEL 8 构建的官方 RPM 包
可以使用如下命令查看系统版本
cat /etc/os-release
以及使用
uname -a
查看内核版本和架构信息。
1. 记录当前信息
记录当前nginx信息
nginx -V 2>&1 | tee /root/nginx-build-info.txt
查看几个容易和系统版本冲突的软件包情况
ldd /usr/sbin/nginx | grep -E 'ssl|pcre|zlib'
我这里是输出这样的结果:
libpcre2-8.so.0 => /usr/lib64/libpcre2-8.so.0 (0x00007f0c65639000)
libssl.so.1.1 => /usr/lib64/libssl.so.1.1 (0x00007f0c655a6000)
2. 数据备份(为升级失败回退做准备-必须要)
先查看当前nginx基本信息:
nginx -V 2>&1
会输出如下这些信息,包含了安装根目录、二进制可执行文件路径、配置文件路径等一些列信息。

有了这些信息,我们就可以开始具体备份操作了:
cp -a /etc/nginx /etc/nginx.bak.$(date +%Y%m%d)
cp -a /usr/sbin/nginx /usr/sbin/nginx.old.$(date +%Y%m%d)
cp -a /usr/lib64/nginx/modules /usr/lib64/nginx/modules.bak.$(date +%Y%m%d)
二、配置 NGINX 官方 YUM 源(CentOS 8)
写入源文件
tee /etc/yum.repos.d/nginx.repo <<'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/8/$basearch/
gpgcheck=0
enabled=1
module_hotfixes=true
EOF
上述命令完整的整条执行,在命令行输入后,需要执行一下回车。
配置好原文件后,下载软件库元数据
yum makecache
我这里执行命令报错:

错误表明 RPM 数据库(位于 /var/lib/rpm)的 Berkeley DB 环境出现了损坏,需要执行恢复操作。
下面是解决步骤:
1.备份rpm数据库
cp -a /var/lib/rpm /var/lib/rpm.backup
-
清理损坏的锁文件和临时环境
rm -f /var/lib/rpm/__db.*
-
重建 RPM 数据库
rpm --rebuilddb
这样rpm报错已经解决。
然后再次执行:
yum makecache
三、预检依赖(模拟安装,不实际改动)
yum install --assumeno nginx-1.30.3 2>&1 | tee /root/nginx-dry-run.log
重点查看输出:
-
如果只提示会额外安装一些依赖包 (如
openssl-libs、pcre2等),且这些包在麒麟系统中能找到,可以继续。 -
如果提示依赖错误 或需要卸载大量已有包 ,立即停止,不要强行安装,此时应改用编译安装。
四、执行升级
yum install nginx-1.30.3 -y
出现了报错:

这个错误是因为麒麟 V10 自带的 nginx-help 包(帮助文档)和 NGINX 官方包中的同名 man 手册文件冲突了。应该是和之前安装过1.21.5版本有关。nginx-help 只是一个文档包,卸载它不会影响 NGINX 核心功能。
解决冲突并重新安装:
# 1. 查看冲突包的具体信息(可选)
rpm -qi nginx-help
# 2. 卸载 nginx-help(忽略依赖关系,避免连带卸载其他包)
rpm -e --nodeps nginx-help
# 3. 重新执行安装(此时冲突已消除)
yum install nginx-1.30.3 -y
执行安装成功:

五、升级后验证
# 1. 查看版本
nginx -v
# 应显示 nginx version: nginx/1.30.3
# 2. 检查配置语法
nginx -t
# 3. 重启服务
systemctl restart nginx
# 4. 检查服务状态
systemctl status nginx
# 5. 测试访问
curl -I http://localhost
到这里就升级完成了。
重新提交安全漏洞扫描,也成功扫描通过了。
六、升级失败回退方案
# 1. 停止 nginx
systemctl stop nginx
# 2. 恢复旧二进制文件
cp /usr/sbin/nginx.1.21.5.backup /usr/sbin/nginx
chmod +x /usr/sbin/nginx
# 3. 恢复旧配置目录
rm -rf /etc/nginx
cp -r /etc/nginx.bak.XXXXXX /etc/nginx # 替换为实际备份目录名
# 4. 重载 systemd 并启动
systemctl daemon-reload
systemctl start nginx
# 5. 卸载新版本的 nginx 包(可选)
yum remove nginx -y
rm /etc/yum.repos.d/nginx.repo
yum makecache