外观
Nginx 通用管理脚本
约 2640 字大约 9 分钟
ShellNginx安装升级
2026-06-04
Nginx 通用管理脚本用于统一管理 Nginx 的安装、升级/覆盖安装、卸载、回滚和状态查看。
当前文件为新管理脚本的初始版本,已实现 Nginx 检测、源码编译安装、源码升级/覆盖安装、回滚、备份清理、状态查看和卸载流程。现有的 Nginx 升级脚本保持不变。
规划能力
| 能力 | 说明 |
|---|---|
| 自动检测 | 检测宿主机 Nginx 是否存在,并识别源码、YUM/DNF、APT、APK、Zypper 等安装方式 |
| 安装指定版本 | 未检测到 Nginx 时,源码编译安装指定版本 |
| 版本选择 | 安装时实时获取 Nginx 主线版本、稳定版和最多 5 个旧版本,并支持编号选择或手动输入版本 |
| 默认模块 | 源码安装默认启用常用 HTTP、Stream、SSL、HTTP/2、gzip、realip、stub_status 等模块,模块范围固定 |
| 升级/覆盖安装 | 已检测到源码编译安装的 Nginx 时,复用当前编译参数编译指定版本并覆盖当前二进制 |
| 卸载 Nginx | 已检测到 Nginx 时,支持卸载前备份、停止服务、强确认和保守清理 |
| 回滚 Nginx | 列出多个历史升级备份,可选择任意一个版本回滚 |
| 查看状态 | 输出版本、路径、配置文件、PID 文件和运行状态 |
| 查看备份 | 只列出当前可用升级备份,不执行删除 |
| 清理备份 | 支持只保留最新备份,或按编号删除指定备份 |
兼容性测试结论
脚本 v1.0 已在以下系统完成回归或专项测试:
| 系统 | 包管理器 | 服务管理 | 结果 |
|---|---|---|---|
| Ubuntu 22.04.5 LTS | apt | systemd | 通过 |
| Ubuntu 24.04 LTS | apt | systemd | 通过 |
| Debian 12 bookworm | apt | systemd | 通过 |
| AlmaLinux 9 | dnf | systemd | 通过 |
| Rocky Linux 9.6 | dnf/yum | systemd | 通过 |
| openSUSE Leap 15.6 | zypper | systemd | 通过 |
| Alpine 3.20 | apk | OpenRC / direct | 通过 |
已覆盖的关键流程:
- 基础健壮性:
bash -n、stdin EOF、管道输入耗尽、无效菜单输入。 - 源码安装:systemd 启动和 direct 直接启动。
- 源码升级/覆盖安装:编译、配置兼容性测试、备份、替换二进制、重启、版本验证。
- 回滚:备份列表、回滚前备份、二进制恢复、配置测试、服务恢复。
- 卸载:错误确认词取消、真实卸载、卸载前备份、包管理器卸载。
- 包管理器安装识别:apt、dnf/yum、zypper、apk;包管理器安装的 Nginx 不执行源码覆盖升级,只支持检测和卸载。
- 版本选择:无效输入拦截;官方不存在版本拦截;官方存在旧版本可手动输入。
依赖注意项:
- 在线解析 Nginx 官方版本列表需要
perl;缺少时自动降级为手动输入版本号。 - 精简容器镜像可能缺少
gzip,会影响.tar.gz解压。 - Alpine 精简镜像默认可能缺少
groupadd/useradd,首次安装前需要补齐 shadow 工具或手动创建nginx用户。
快速开始
使用 curl:
curl -sL https://script.merma.cn/scripts/shell/ManageScript/manage_nginx.sh -o /tmp/manage_nginx.sh && bash /tmp/manage_nginx.sh; rm -f /tmp/manage_nginx.sh使用 wget:
wget -qO /tmp/manage_nginx.sh https://script.merma.cn/scripts/shell/ManageScript/manage_nginx.sh && bash /tmp/manage_nginx.sh; rm -f /tmp/manage_nginx.sh交互设计
未检测到 Nginx 时:
[1] 安装指定版本
[0] 退出已检测到 Nginx 时:
[1] 升级/覆盖安装指定版本
[2] 卸载 Nginx
[3] 回滚 Nginx
[4] 查看状态
[5] 查看备份
[6] 清理旧备份
[0] 退出安装说明
安装功能当前采用源码编译方式。脚本会从 https://nginx.org/en/download.html 获取官方版本信息,获取期间会显示“正在在线获取 Nginx 官方版本...”的转圈提示。获取成功后展示主线版本、稳定版和最多 5 个旧版本,并允许用户按编号选择;如果获取失败,会要求手动输入版本号。
在线获取并解析 Nginx 官方版本列表需要系统存在 perl。如果缺少 perl,脚本会明确提示并改为手动输入版本号。
版本展示示例:
Mainline version(主线版本) : 1.29.3
Stable version(稳定版) : 1.28.0
Legacy versions(旧版本) : 1.26.3
Legacy versions(旧版本) : 1.24.0默认安装目录为 Nginx 源码默认路径;用户可以在安装时输入自定义目录,直接回车则使用默认值:
/usr/local/nginx安装时也可以输入离线源码包完整路径,留空则在线下载:
请输入离线源码包完整路径(留空则在线下载):默认编译参数:
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_dav_module \
--with-http_stub_status_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-stream \
--with-stream_ssl_module \
--with-http_v2_module脚本会自动安装编译依赖,并创建 nginx 系统用户和用户组:
groupadd -r nginx
useradd -r -g nginx -s /sbin/nologin -M nginx安装完成后会创建 /usr/local/sbin/ 软链接并执行 nginx -t。随后会提示选择启动管理方式:
Y = 创建 nginx.service,并使用 systemctl 管理启动/停止/重启/开机自启
n = 不创建 systemd 服务,安装后使用 nginx 二进制直接启动安装结束后会输出管理命令摘要。选择 systemd 时会输出:
启动: systemctl start nginx
停止: systemctl stop nginx
重启: systemctl restart nginx
重载: systemctl reload nginx
状态: systemctl status nginx跳过 systemd 时,脚本已创建 /usr/local/sbin/ 软链接,因此会输出简化后的管理命令:
启动: nginx
停止: nginx -s quit
重启: nginx -s quit && nginx
重载: nginx -s reload
状态: ps -ef | grep '[n]ginx'
测试配置: nginx -t升级/覆盖安装说明
当前升级/覆盖安装功能仅支持源码编译安装的 Nginx。脚本会复用当前 nginx -V 中的 configure arguments,避免改变原有模块和安装路径。
如果检测到的 Nginx 来自 YUM、DNF、APT、APK 或 Zypper 等包管理器,菜单会标注升级/覆盖安装仅源码安装支持;选择该功能时脚本会提示当前安装方式不支持源码覆盖升级。
如果脚本内置默认编译参数与原有 Nginx 编译参数不一致,升级时以原有 Nginx 的 nginx -V 编译参数为准。脚本内置参数只用于全新安装。
升级重启也会按原运行管理方式处理:原来通过 systemd 运行的 Nginx 使用 systemctl restart nginx;否则使用 nginx 二进制方式停止并重新启动。
流程:
- 选择目标版本,也可以手动输入版本。
- 可输入离线源码包完整路径,留空则在线下载。
- 使用当前编译参数执行
./configure和make。 - 使用新编译出的
objs/nginx测试当前配置文件。 - 备份旧二进制和配置目录。
- 替换当前 nginx 二进制。
- 重启 Nginx 并验证版本。
升级前会要求确认,直接回车默认继续升级:
确认继续升级?[Y/n]:备份目录位于当前安装前缀下,例如:
/usr/local/nginx/backup_20260604_120000回滚说明
回滚功能会读取当前安装前缀下的升级备份目录:
/usr/local/nginx/backup_*脚本会列出所有可用备份,包括原版本、目标版本、备份时间、大小和路径。用户可以选择任意一个备份进行回滚,不限制只能回滚最新版本。
回滚选择支持输入 0 取消,取消后会返回主菜单。
确认回滚后,脚本会询问是否先备份当前版本:
回滚前是否备份当前版本?[Y/n]:默认回车会备份当前二进制和配置目录,不备份站点 html 目录。该备份会进入统一的升级备份列表,后续可继续查看、回滚或清理。
回滚时默认恢复旧二进制,并会询问是否同时恢复配置目录:
是否同时恢复配置目录?[y/N]:回滚后会执行配置测试,并按原运行管理方式重启 Nginx。
查看备份说明
查看备份功能只读取并展示当前安装前缀下的升级备份目录,不会删除任何文件:
/usr/local/nginx/backup_*备份列表会按时间倒序展示,并为当前列表生成连续编号。编号只是本次菜单里的临时序号,删除备份后再次进入菜单会重新扫描并重新编号。
列表中的 备份版本 表示备份里实际保存的 Nginx 版本,也就是选择该备份回滚时会恢复到的版本。触发操作 表示该备份是在什么操作前创建的,例如 覆盖安装 1.31.1 前 或 回滚前自动备份。
清理备份说明
清理备份功能只处理当前安装前缀下的升级备份目录:
/usr/local/nginx/backup_*支持两种清理方式:
- 多个备份时可输入
a:只保留最新一个备份,删除其余备份。 - 输入备份编号:删除指定备份,多个编号可用空格分隔,例如
2 3。 - 输入
q:取消清理并返回主菜单。
输入编号时,只有当前列表范围内的编号有效。例如当前显示 10 个备份,则 1-10 有效,超出范围的编号会被判定为无效。若输入内容没有任何有效编号,脚本会直接取消清理,不会继续要求确认删除。
卸载备份位于 /opt/nginx_manage_backup/,不会被这个清理功能处理。
错误提示
脚本启用了严格错误检测。遇到未处理错误时,会输出失败行号、失败命令和操作日志路径,避免静默退出。
卸载说明
卸载 Nginx 前,脚本会先输出当前检测到的安装方式、版本、二进制路径、安装前缀和配置文件路径,并要求输入确认词:
确认卸载请输入 uninstall:卸载流程会自动备份当前二进制、配置目录和 html 目录,备份位置类似:
/opt/nginx_manage_backup/uninstall_20260604_120000不同安装方式的处理策略:
- 源码安装:停止 Nginx,删除当前 nginx 二进制和指向它的软链接,默认保留安装前缀目录、配置和站点文件。
- 源码安装如需删除安装前缀目录,需要再次输入
delete-prefix。 - YUM / DNF / APT / APK / Zypper:调用对应包管理器执行 remove,不默认执行 purge。
- 包管理器卸载默认保留配置文件,彻底清理需用户手动确认后处理。