Nginx高危漏洞批量检测自动升级脚本
为什么需要自动化漏洞检测与升级
Nginx 作为使用最广的 Web 服务器之一,经常曝出高危漏洞(例如内存泄漏、请求走私等)。
如果手上有好几台服务器,一台台登录检查版本、手动升级非常低效。
一个自动化的批量检测与升级脚本能帮你快速发现风险、一键修复,省下大量时间。
本文会从零开始,教你写一个可直接使用的脚本,并讲清楚每一步在做什么。
准备工作:环境与权限
- 操作系统:CentOS 7/8 或 Ubuntu 20.04/22.04(命令略有区别,脚本中会区分)
- 权限:需要 sudo 或 root 权限执行升级操作
- 工具:bash、curl、grep(一般系统自带)
- 如果你有多台服务器,建议在其中一台管理机上运行脚本,通过 SSH 密钥连接其他机器(本文示例针对单机运行,批量部分会给出思路)
编写核心脚本:检测版本、比对漏洞、自动升级
以下脚本是核心逻辑,我把它命名为 nginx_security_check.sh,你可以直接复制保存。
#!/bin/bash
# Nginx 高危漏洞批量检测与自动升级脚本
# 适用系统:CentOS / Ubuntu
# 获取当前 Nginx 版本
nginx_version=$(nginx -v 2>&1 | grep -oP 'nginx/\K[0-9.]+')
if [ -z "$nginx_version" ]; then
echo "未检测到 Nginx,请先安装。"
exit 1
fi
echo "当前 Nginx 版本: $nginx_version"
# 定义一个已知不安全版本列表(此处仅为示例,实际应定期更新)
# 格式:每个版本一行,支持通配符
unsafe_versions=(
"1.20.0"
"1.21.0"
"1.21.1"
"1.21.3"
"1.21.4"
"1.22.0"
)
# 检查当前版本是否在不安全列表内
need_upgrade=0
for ver in "${unsafe_versions[@]}"; do
if [ "$nginx_version" = "$ver" ]; then
need_upgrade=1
break
fi
done
if [ $need_upgrade -eq 0 ]; then
echo "当前版本不在已知高危列表,无需升级。"
exit 0
fi
# 开始自动升级
if [ -f /etc/redhat-release ]; then
# CentOS / RHEL
echo "检测到 CentOS 系统,执行 yum 升级..."
sudo yum update -y nginx
elif [ -f /etc/lsb-release ] || [ -f /etc/debian_version ]; then
# Ubuntu / Debian
echo "检测到 Ubuntu/Debian 系统,执行 apt 升级..."
sudo apt-get update -y
sudo apt-get install --only-upgrade -y nginx
else
echo "不支持的发行版,请手动升级。"
exit 1
fi
# 验证升级后版本
new_version=$(nginx -v 2>&1 | grep -oP 'nginx/\K[0-9.]+')
echo "升级完成,当前版本: $new_version"
脚本说明
- 第 4-8 行:从
nginx -v命令中提取版本号,如果没有安装则退出。 - 第 11-17 行:定义高危版本列表,你可以根据 Nginx 官方安全公告 定期更新这个数组。
- 第 20-27 行:循环比对版本,如果匹配则标记需要升级。
- 第 29-38 行:根据系统类型自动选择 yum 或 apt 进行升级。
- 第 41-43 行:升级完成后再次检查版本,确认生效。
执行验证与批量扩展
单台服务器运行
- 把脚本保存到服务器(例如
/usr/local/bin/nginx_security_check.sh) - 赋予执行权限:
chmod +x /usr/local/bin/nginx_security_check.sh - 运行:
sudo ./nginx_security_check.sh - 输出示例:
当前 Nginx 版本: 1.21.0
检测到 CentOS 系统,执行 yum 升级...
(升级过程)
升级完成,当前版本: 1.24.0
批量检测多台服务器
你可以将脚本放在管理机上,使用 for 循环配合 ssh:
for ip in 192.168.1.10 192.168.1.11; do
ssh -o StrictHostKeyChecking=no user@$ip "sudo bash /path/to/nginx_security_check.sh"
done
前提是管理机已经配置好 SSH 密钥认证,并且目标服务器上的 sudo 不需要密码。
避坑指南与高频问题
Q:脚本提示“未检测到 Nginx”但我确实安装了?
A:检查 Nginx 是否在 PATH 中,或者是否通过源码安装到自定义目录。可以先用 which nginx 或 find / -name nginx -type f 找到路径,然后修改脚本中的命令为绝对路径,比如 /usr/local/nginx/sbin/nginx -v。
Q:升级后网站会重启吗?
A:使用 yum update 或 apt install --only-upgrade 会重新启动 Nginx 服务,短时间中断请求。建议在业务低峰期执行,或者先设置健康检查。
Q:我如何知道哪些版本是真正的高危?
A:建议关注 Nginx 官方安全公告(https://nginx.org/en/security_advisories.html)以及各 Linux 发行版的安全仓库。脚本中的列表只是示例,生产环境要定期更新。
Q:升级失败回滚怎么办?
A:升级前可以备份当前配置:cp -r /etc/nginx /etc/nginx.bak。如果升级后出现问题,直接恢复备份并重新安装旧版本(使用 yum downgrade nginx 或 apt install nginx=旧版本号)。
写在最后
Nginx 安全无小事,批量检测与自动升级脚本可以大大降低维护压力。
你只需要定期更新脚本中的不安全版本列表,然后定时运行(例如添加 cron 任务),就能持续保持服务器在安全版本上。
如果你正在处理多台服务器的 Nginx 漏洞修补,建议先按本文步骤在一台测试机验证脚本,再推广到生产环境。
遇到异常时优先回看避坑和高频问题部分,基本都能解决。