📌 环境说明

  • 操作系统:CentOS Linux release 7.5.1804 (Core)

  • 原 Nginx 版本:1.16.1(通过 YUM 安装,且带有全套 nginx-mod-* 模块)

  • 目标版本:1.26.1(为了修复近期的高危安全漏洞 CVE)

  • 核心难点:CentOS 7 已 EOL,官方和第三方仓库对 CentOS 7 的最新版本模块支持存在滞后和冲突。


🛠️ 第一步:升级前准备与备份

1. 备份现有的 Nginx 配置文件

bash

复制

下载

sudo cp -r /etc/nginx /etc/nginx.bak.$(date +%F)

2. 配置 Nginx 官方 YUM 源
由于 CentOS 7 默认源版本太旧,需要添加官方源获取最新版。

bash

复制

下载

sudo vi /etc/yum.repos.d/nginx.repo

写入以下内容:

ini

复制

下载

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

3. 导入 GPG 密钥并刷新缓存

bash

复制

下载

sudo rpm --import https://nginx.org/keys/nginx_signing.key
sudo yum clean all
sudo yum makecache

🚀 第二步:清理旧环境与安装新版核心

1. 移除旧版 Nginx 及其绑定的旧模块(关键步骤)
因为原系统的 nginx-mod-* 是与旧版本强绑定的,必须连同主程序一起卸载,否则升级会失败。

bash

复制

下载

sudo yum remove nginx nginx-mod-*

2. 安装最新版 Nginx 核心
执行安装命令,此时 YUM 会从官方源拉取最新的 1.26.1 版本。

bash

复制

下载

sudo yum install nginx -y

⚠️ 第三步:关于扩展模块的特殊处理(踩坑记录)

【排查过程】

  • 尝试重装旧模块或 nginx-all-modules 时,发现系统试图从 epel 源安装 1.20.1 版本的模块,与你新装的 1.26.1 核心产生 ABI 不兼容(依赖冲突)。

  • 尝试从第三方源(CodeIT)获取,但由于 CentOS 7 已停止维护,官方脚本和仓库已无法正常获取针对 EL7 的新版包。

  • 尝试源码编译准备作为保底方案。

【最终结论】
运行 nginx -t 检查发现,当前业务配置并未使用到 stream(四层代理)、mail 等特殊模块。
处理结果:无需强行安装扩展模块,仅保留 Nginx 核心即可满足现有业务需求,既安全又避免了包冲突。


✅ 第四步:验证与收尾

1. 检查配置语法

bash

复制

下载

sudo nginx -t
# 输出提示:syntax is ok / test is successful

2. 重启服务并查看状态

bash

复制

下载

sudo systemctl restart nginx
sudo systemctl status nginx
# 输出提示:Active: active (running)

3. 设置开机自启
注意:新安装后 Nginx 默认可能是 disabled 状态,必须手动开启。

bash

复制

下载

sudo systemctl enable nginx

4. 验证版本

bash

复制

下载

nginx -v
# 输出提示:nginx version: nginx/1.26.1

💡 核心经验总结(Tips)

  1. CentOS 7 EOL 的痛点:在 CentOS 7 上通过 YUM 安装高版本软件时,极易遇到官方源与第三方源(EPEL)版本脱节的问题。如果新版本依赖旧的 EPEL 模块,直接装会报错。

  2. 模块化认知:Nginx 能启动且 nginx -t 通过,说明核心功能正常。如果代码没用到 stream 等高级模块,千万别为了“看着全”去装全量模块,容易给自己挖坑。

  3. 平滑替代方案:如果未来业务确实需要 stream 模块,由于目前没有匹配 1.26.1 的 RPM 包,唯一的解决办法是下载 1.26.1 源码,使用 --with-stream=dynamic 和 --with-compat 进行源码编译,生成 .so 文件后通过 load_module 加载。

Logo

宁波官方开源宣传和活动阵地,欢迎各位和我们共建开源生态体系!

更多推荐