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 行:升级完成后再次检查版本,确认生效。

执行验证与批量扩展

单台服务器运行

  1. 把脚本保存到服务器(例如 /usr/local/bin/nginx_security_check.sh
  2. 赋予执行权限:chmod +x /usr/local/bin/nginx_security_check.sh
  3. 运行:sudo ./nginx_security_check.sh
  4. 输出示例:
   当前 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 nginxfind / -name nginx -type f 找到路径,然后修改脚本中的命令为绝对路径,比如 /usr/local/nginx/sbin/nginx -v

Q:升级后网站会重启吗?
A:使用 yum updateapt 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 nginxapt install nginx=旧版本号)。

写在最后

Nginx 安全无小事,批量检测与自动升级脚本可以大大降低维护压力。
你只需要定期更新脚本中的不安全版本列表,然后定时运行(例如添加 cron 任务),就能持续保持服务器在安全版本上。
如果你正在处理多台服务器的 Nginx 漏洞修补,建议先按本文步骤在一台测试机验证脚本,再推广到生产环境。
遇到异常时优先回看避坑和高频问题部分,基本都能解决。

分享到:
上一篇
收录两极分化站内结构与服务器双重优化
下一篇
爬虫抓取失败防火墙与站点配置整改清单
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意