生产环境“NGINX使用官方 RPM 包升级,以便通过第三方安全漏洞扫描”具体实践

我这里会描述我详细操作过程,比较啰嗦,包括遇到问题的解决。请耐心查阅。

升级背景:系统安全漏洞扫描,扫描到当前服务器安装的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
  1. 清理损坏的锁文件和临时环境

    rm -f /var/lib/rpm/__db.*

  2. 重建 RPM 数据库

    rpm --rebuilddb

这样rpm报错已经解决。

然后再次执行:

复制代码
yum makecache

三、预检依赖(模拟安装,不实际改动)

复制代码
yum install --assumeno nginx-1.30.3 2>&1 | tee /root/nginx-dry-run.log

重点查看输出

  • 如果只提示会额外安装一些依赖包 (如 openssl-libspcre2 等),且这些包在麒麟系统中能找到,可以继续。

  • 如果提示依赖错误需要卸载大量已有包立即停止,不要强行安装,此时应改用编译安装。

四、执行升级

复制代码
 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