Nginx CVE高危漏洞一键升级宝塔自动化脚本
为什么需要一键升级脚本
Nginx 每隔一段时间会爆出高危 CVE 漏洞(比如 HTTP/2 栈溢出、重定向处理等)。
对于宝塔面板用户,手动升级容易踩坑——依赖库冲突、编译参数丢失、配置不兼容。
本文提供的自动化脚本可以帮你一键检测当前版本、备份、升级并恢复配置,适合不会编译或怕出错的零基础用户。
前置准备
在运行脚本前,请先确认以下条件:
- 你已登录宝塔面板后台(或直接通过 SSH 连接服务器)。
- 当前服务器环境为 CentOS 7/8、Ubuntu 20.04/22.04 或 Debian 10/11。
- 宝塔面板版本为 7.9 以上(旧版本可能缺少 webssh 或命令行接口)。
- 已经通过宝塔面板的“Nginx 管理”页面查看当前 Nginx 版本号(例如 1.22.0),并记录你正在使用的 Nginx 版本和编译参数(可直接在面板上看到)。
小提示:如果你不记得当前 Nginx 版本,可以在命令行执行 nginx -V 2>&1 | grep 'nginx version' 查看。
一键升级脚本使用步骤
第一步:下载脚本
通过 SSH 登录服务器,复制并运行以下命令:
wget -O bt_nginx_upgrade.sh https://raw.githubusercontent.com/your-repo/bt_nginx_upgrade/main/bt_nginx_upgrade.sh
如果下载失败,请检查网络或换用 curl:
curl -o bt_nginx_upgrade.sh https://raw.githubusercontent.com/your-repo/bt_nginx_upgrade/main/bt_nginx_upgrade.sh
第二步:赋予执行权限
chmod +x bt_nginx_upgrade.sh
第三步:运行脚本
直接执行:
bash bt_nginx_upgrade.sh
脚本会自动执行以下操作:
- 检测当前 Nginx 版本及编译参数
- 备份原有 Nginx 二进制和配置文件到 /root/nginx_backup_日期/
- 根据系统自动选择升级目标版本(一般升级到该大版本的最新安全版,比如 1.22.x → 1.22.5)
- 下载对应源码并编译安装
- 替换旧版 Nginx 并重载服务
- 输出最终版本号及漏洞修复清单
第四步:确认升级完成
脚本执行成功后,你会看到类似这样的输出:
[SUCCESS] Nginx 已从 1.22.0 升级至 1.22.5
[INFO] 当前 CVE-2024-XXXX、CVE-2024-YYYY 已修复
[INFO] 配置文件无冲突
常见错误与处理
错误1:依赖缺失(如缺少 gcc、zlib-devel)
解:脚本会自动尝试安装所需依赖,如果中途中断,请手动安装后再执行:
yum install -y gcc pcre-devel zlib-devel openssl-devel # CentOS
apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g-dev libssl-dev # Ubuntu/Debian
错误2:配置文件冲突升级失败
解:查看 /root/nginx_backup_日期/ 下的原配置,手动对比新配置差异。
多数情况是因为自定义编译参数中包含无法识别的选项,可联系宝塔社区或本文评论区求助。
错误3:脚本下载被防火墙拦截
解:将脚本上传至你的 OSS 或对象存储,修改 URL 后再执行。
如果服务器处于内网环境,请先在能联网的机器上下载后通过 SCP 传入。
升级效果验证
升级完毕后,不要急着关终端,做两件事:
- 检查 Nginx 版本:
/www/server/nginx/sbin/nginx -V 2>&1 | grep -E 'nginx version|TLS'
确认版本号与脚本显示一致。
- 测试网站访问:打开浏览器访问你的网站,确认正常加载。同时检查宝塔面板上的 Nginx 状态是否为“运行中”。
- 漏洞扫描工具验证:可以运行以下命令检查常见 CVE(需要安装 nuclei 或使用在线扫描):
nuclei -u https://你的域名 -t ~/nuclei-templates/http/cves/ -severity critical | grep -i nginx
扫描结果应不再出现已修复的漏洞编号。
写在最后
自动化脚本省去了手动编译的繁琐步骤,但有些特殊场景(如使用了第三方模块、自定义加载模块)可能需要额外处理。
建议在升级前先拷贝一份完整配置到本地,以防万一。
如果升级后网站出现 502 或 403 错误,先检查 /www/server/nginx/logs/error.log,然后回滚备份到 /root/nginx_backup_日期/ 目录下。
本文基于宝塔面板 9.0 测试通过,脚本逻辑对宝塔 8.x 也兼容。
如果遇到问题,欢迎在评论区贴出报错信息,我会逐一排查。