欢迎来到思维库

思维库

Nginx 平滑升级的实战指南!(含备份+业务0中断+回滚)

时间:2025-11-05 12:14:25 出处:IT科技阅读(143)

今天分享一下Nginx如何平滑升级,滑升含备做到零中断。实战

在实际生产环境,指南安全部门一般都会定期去扫描程序漏洞,份业基本都需要升级版本。滑升含备

部分运维人员的实战做法是:停服务--> 删除旧版本nginx-->安装新版本nginx-->启动服务。

这种方式需要停服务,指南非常影响用户体验感,份业所以我下面介绍一下如何进行不停机且安全可控得进行平滑升级Nginx。滑升含备

1. 实验环境说明操作系统:Rockylinux9.4当前nginx是实战编译安装部署路径:/data/nginx从nginx1.26.2升级到1.29.02. 升级前先备份!非常关键!指南

线上升级,份业没备份 = 自杀式升级。滑升含备

全量备份:

复制tar -zcvf /data/nginx-backup-$(date +%F).tar.gz /data/nginx/1.

回滚时你只需 tar -zxvf + reload,实战1 分钟恢复原状。指南

3. 确认原版本和编译参数 复制[root@webserver data]# nginx -V nginx version: nginx/1.26.2 built by gcc 11.5.0 20240719 (Red Hat 11.5.0-5) (GCC) built with OpenSSL 3.2.2 4 Jun 2024 TLS SNI support enabled configure arguments: --prefix=/data/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre --with-stream --with-stream_ssl_module1.2.3.4.5.6.

非常重要!新版本必须用相同参数编译才能平滑替换,不过可以新增参数!源码库

4. 安装依赖 复制dnf install -y gcc make zlib-devel pcre-devel openssl-devel wget1.

这一步可以省略,一般编译旧版本时已经安装了依赖。

5. 下载并编译 Nginx 新版本

(1) 下载源码

版本可以具体根据漏扫要求,一般是建议最新版本,我这边选1.29.0版本:

复制wget https://nginx.org/download/nginx-1.29.0.tar.gz tar -zxvf nginx-1.29.0.tar.gz cd nginx-1.29.01.2.3.

(2) 使用原配置参数重新编译

这里也可以添加一些新的参数,但是尽量不要删除以前的参数,建议在已有基础添加新参数。

复制./configure --prefix=/data/nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-pcre \ --with-stream \ --with-stream_ssl_module make1.2.3.4.5.6.7.8.

注意注意:千万不要 make install,避免直接覆盖现有 Nginx!

6. 平滑升级核心流程

(1) 替换 Nginx 可执行文件

复制# 移动旧版本可执行文件 mv /data/nginx/sbin/nginx /data/nginx/nginx/sbin/nginx.old # 将新版本的执行文件放置在安装目录下 cp ./objs/nginx /data/nginx/sbin/nginx # 检测Nginx进程,可见旧的版本进程还在运行 ps -ef |grep nginx1.2.3.4.5.6.7.8.

(2)启动新主进程(平滑切换)

复制# 杀掉旧版nginx主进程,让新进程重新生成 kill -USR2 `cat /data/nginx/logs/nginx.pid` # 上面引用部分主要是找出nginx的PID,企商汇你也可以根据ps来找。1.2.3.4.

此时存在4个进程.  2个旧版nginx进程  2个新版nginx进程。

新的 master 进程加载新版本。

老版本PID文件变为 .pid.oldbin,仍然工作中:

(3) 优雅关闭旧 worker进程

复制kill -WINCH `cat /data/nginx/logs/nginx.pid.oldbin`1.

旧worker 会逐步停止服务,连接自动转移到新版本,旧master进程还在。

7. 验证是否升级成功

查看版本:

复制nginx -v1.

检查日志无报错:

复制tail /data/nginx/logs/error.log1.

确认监听端口仍在线:

复制netstat -lntup |grep nginx1.

多核 CPU 下也可观察进程切换:

复制ps -ef | grep nginx1.

8. 结束旧主进程

等业务确认OK后,没问题,就可以杀掉旧的master进程了。

复制kill -QUIT `cat /data/nginx/logs/nginx.pid.oldbin` # 再次检查 ps -ef |grep nginx1.2.3.4.

此时旧版进程彻底退出,升级完成!

9. 快速回滚操作

如果升级后出问题,只需执行:

复制cp /data/nginx/sbin/nginx.bak /data/nginx/sbin/nginx nginx -s reload1.2.

也可以恢复整个 Nginx 安装目录:根据之前那个备份目录直接解压后重载nginx:

复制tar -zxvf /data/nginx-backup-YYYY-MM-DD.tar.gz -C / nginx -s reload1.2.

谨记:先备份后操作!如果可以测试环境先行!

分享到:

上一篇:大家都知道在Linux下可以随意的把分区挂载到一个空文件夹中,使用命令mount 驱动器名 文件夹名即可,但是这个操作需要root权限,而且每次开机之后都要挂载一次,是不是很麻烦。下面给大家一个介绍一个方法在ubuntu下永久挂在某分区。 先介绍一下我的电脑情况,安装Ubuntu的时/和/home都是单独挂载的,但是还有一个43GB的ext4分区当时没有设置挂载……今天为了给/home增加下容量,打算挂载到/home下的文件夹amusement中(Linux系统目录结构及作用解析)。 首先要改下这个分区的所有者,因为没有挂在的所有者是默认root拥有的,我们没有权限操作。所以可以先做sudo nautilus来以管理员权限执行资源管理器,然后转到你没有挂载的那个分区,右键,属性,权限,把所有者改成你的用户,文件夹访问设成创建和删除文件,文件访问设置成读写,然后吧组群也该成你的组群,设置可以和上面一样,这个不影响本用户的使用,无所谓。确定 执行sudo gedit /etc/fstab 加入以下内容: UUID=971f03e1-1793-4840-a4e0-5bc4d5186716 /home/huanr/amusement ext4 defaults 0 3 注意UUID是你的硬盘分区号,在属性中可以看到,后面是要挂载的文件夹,要空文件夹才行, 后面的设置参考/分区的设置,假如前面挂在的分区有 0 2就写成 0 3,如有 0 7就写成 0 8,保存文件,重启后即可生效。

下一篇:为了方便开发人员在Visual Studio中使用GitHub,微软联合GitHub为Visual Studio 2015开发了GitHub插件,然而由于该插件中存在Bug,导致一位用户在短短几小时内就损失了6500美元。这一事件刚发生不久。今天小编给大家带来微软vs2015gitHub插件bug解决方法及微软vs2015gitHub插件更新下载,为了大家使用安全,用户们请及时更新! 事情的始末是这样的:从去年开始,黑客们就开始借助机器人程序24小时扫描GitHub,企图窃取用户不小心公开在GitHub中的亚马逊AWS API key,然后利用窃取到的AWS API key租赁服务器用于挖比特币。由于Visual Studio 2015的GitHub插件存在一处Bug,导致这位用户本想提交到私有仓库的代码被推送到了公有库,结果AWS key被暴露。不幸的是,在意识到问题之前,AWS key已被某比特币矿主爬到,结果导致该用户在几小时内损失了6500美元。事发后, 微软与GitHub积极联系了这位用户,目前已经提供了修复更新。假如你正在使用这款插件,请及时更新。Visual Studio 2015 GitHub插件更新:(点此下载)。

温馨提示:以上内容和图片整理于网络,仅供参考,希望对您有帮助!如有侵权行为请联系删除!

猜你喜欢

友情链接: