ubuntu nginx更新升级要注意什么
小樊
32
2026-01-03 16:01:06
Ubuntu 下 Nginx 升级的关键注意事项
一 升级前检查清单
- 明确安装方式:使用 dpkg -l nginx 或 which nginx 判断是 apt 包管理 还是 源码编译;若是包管理,确认是否来自 官方 Nginx 仓库(版本通常更新更快)。
- 备份关键资产:打包 /etc/nginx 配置、站点文件、证书;备份二进制与日志,例如:
tar -zcvf /data/backup/nginx-conf-$(date +%F).tar.gz /etc/nginx
cp /usr/sbin/nginx /usr/sbin/nginx.old-$(nginx -v 2>&1 | awk ‘{print $3}’ | cut -d’/’ -f2)
- 记录编译参数与模块:执行 nginx -V 复制完整 configure arguments,后续编译或回滚都需复用。
- 依赖与兼容性:Ubuntu 编译常用依赖 build-essential、libpcre3-dev、zlib1g-dev、libssl-dev;第三方或动态模块(如 ngx_brotli、geoip、passenger)需与目标版本匹配。
- 变更与风险:查阅 变更日志 与 不兼容项;如启用 动态模块(=dynamic),升级后需确保 .so 版本匹配,否则会出现 “module version X instead of Y” 类报错。
- 回滚预案:准备旧版本 .deb 包 或旧二进制;规划回滚步骤与窗口期,优先在测试环境演练。
二 选择升级路径
- 包管理器升级(无自定义模块优先):
- 添加或确认 Nginx 官方仓库(按需选择 stable/mainline,代号如 jammy/focal);
- 执行 apt update && apt install --only-upgrade nginx;
- 用 nginx -t 校验配置,再 systemctl reload nginx;
- 用 nginx -V 核对版本与模块是否一致。
- 源码编译升级(有自定义模块或特殊路径):
- 用 nginx -V 取旧参数,下载新源码后 ./configure 复用参数并添加新模块;
- 仅执行 make(不要 make install),在 objs/nginx 得到新二进制;
- 备份旧二进制后替换,先 objs/nginx -t 验证;
- 采用信号或脚本完成 平滑升级(见下一节)。
三 生产平滑升级与回滚
- 信号流程(基于 master/worker 模型):
- 获取旧 master PID:OLD_PID=$(cat /run/nginx.pid)
- 启动新 master:kill -USR2 $OLD_PID(旧 pid 文件会变为 nginx.pid.oldbin)
- 退役旧 worker:kill -WINCH $OLD_PID(旧进程处理完现有连接后退出)
- 验证无误后收尾:kill -QUIT $OLD_PID
- 快速验证:
nginx -v、nginx -V、curl -I https://your-domain/;必要时查看 error.log 与 stub_status。
- 回滚要点:
- 包管理:安装旧版本 .deb(如 apt install nginx=1.24.0-1~bionic),再重启;
- 源码:恢复旧二进制(如 cp nginx.old /usr/sbin/nginx),向旧 master 发 HUP 拉起旧 worker,随后 QUIT 新 master。
四 常见坑与安全建议
- 动态模块版本不匹配:升级后若 ngx_http_geoip_module.so / ngx_http_passenger_module.so 提示版本不一致,需安装与新版本匹配的模块或临时移除相关配置再升级。
- 权限与端口:bind() to 0.0.0.0:80 failed (13: Permission denied) 常见于非 root 绑定 1024 以下端口;可用 setcap ‘cap_net_bind_service=+ep’ /usr/sbin/nginx 授权,或改用 8080/8443 等端口。
- 配置与语法:升级后用 nginx -t 严格校验;如新增或调整 SSL/TLS 参数,确保证书路径、权限与协议套件正确。
- 版本与漏洞:如需修复特定 CVE,确认目标版本已包含修复(例如 CVE-2025-23419 要求 1.27.0+);必要时切换 mainline 源获取修复版本。
- 信息暴露:生产建议关闭版本号显示,在 http { server_tokens off; } 后 reload。
五 容器与 Ingress 场景
- 若使用 Kubernetes Ingress-NGINX:升级前关注版本变更与默认行为调整,例如:
- 3.0.34+ 移除 Webhook 中的 nginx -t 预检,启用 snippet 注解时风险更高,需加强日志巡检;
- 2.4.6+ 默认禁用 snippet 注解,需在插件配置中显式开启并评估风险级别;
- 2.3.3+ 默认不再支持 TLS v1.0/1.1;
- 2.1.1+ 不再支持通过 snippet 使用 root/alias 指令;
- 仅在 2.1.33+/2.2.42+/2.4.6+ 具备完善的优雅退出与无损升级能力。
- 建议:非必要时避免 snippet,变更前后做 dry-run/审计,并在低峰期滚动升级。