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 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 漏洞修补,建议先按本文步骤在一台测试机验证脚本,再推广到生产环境。
遇到异常时优先回看避坑和高频问题部分,基本都能解决。

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

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意