Nginx进行平滑升级的实战指南(不中断服务版本更新)

2025-08-03 21:50

本文主要是介绍Nginx进行平滑升级的实战指南(不中断服务版本更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升...

Nginx无缝升级版本,支持及时回滚。
升级目的:解决Nginx漏洞
平滑升级的核心是 不中断服务 的前提下,用新版本的 Nginx 替换旧版本。新编译的 objs/nginx 是新版本的二进制文件,需要覆盖旧的二进制文件,以便 Master 进程启动新的 Worker 进程时使用新版本。

一.下载并编译新版Nginx

1.下载解压

nginx下载找到并下载Nginx最稳定版本,通过SSH上传至服务器

Nginx进行平滑升级的实战指南(不中断服务版本更新)

也可复制链接在服务器通过wget下载。

Nginx进行平滑升级的实战指南(不中断服务版本更新)

wget https://nginx.org/download/nginx-1.28.0.tar.gz

下载安装至指定目录后解压。

cd /home/ngtl/
tar -zxvf nginx-1.28.0.tar.gz
cd nginx-1.28.0/

Nginx进行平滑升级的实战指南(不中断服务版本更新)

2.编译

编译之前需要确定之前版本的Nginx的编译目录,和模块兼容性。找到正在运行的Nginx可执行文件并执行命令。

/usr/local/nginx/sbin/nginx -V

Nginx进行平滑升级的实战指南(不中断服务版本更新)

可以看到从--prefix之后都是执行./configure的参数,在新Nginx编译的时候,参数必须和要升级的Nginx一样.

关键步骤

  1. 完整复制 configure arguments: 后的参数
  2. 必须保证新版本配置js参数与旧版完全一致
  3. 特别注意第三方模块路径(如 OpenSSL)

然后在刚才解压的Nginx目录下执行以下命令然后等待:

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_realip_module --with-stream --with-http_ssl_module --with-openssl=/home/ngtl/openssl-1.1.1l

./configure成功后如下图:

Nginx进行平滑升级的实战指南(不中断服务版本更新)

然后继续执行make命令,注意这里不要执行make insyall,不然会覆盖原来的配置文件,包括config下面的。

make

执行成功以后,会在解压目录下生成objs目录,目录下会生成需要替换的nginx可执行文件。

注意事项

  • 编译产物路径:nginx/objs/nginx
  • 禁止执行 make install 防止覆盖现有配置
  • 出现 ./configure: error 需检查缺失的依赖库

二.替换可执行文件,并平滑升级

1.替换可执行文件

备份旧版本方便报错后回滚

# 备份旧的 Nginx 可执行文件
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

# 备份配置文件(可选)
cp -r /usr/local/nginx/conf /usr/local/nginx/conf.bak

替换旧的二进制文件

将新编译的 objs/nginx 复制到旧版本的安装目录中:

cp objs/nginx /usr/local/nginx/sbin/

注意如果此处提示报错:cp: cannot create regular file ‘/usr/local/nginx/sbin/nginx’: Text file busChina编程y。这表明目标文件(nginx 可执行文件)正在被其他进程占用。
解决方法:需要先通过 Nginx 平滑升级流程 处理旧进程,确保替换二进制文件时不会冲突。

2.进行平滑升级处理

发送信号启动新版本进程

# 获取旧 Nginx 主进程的 PID
cat /usr/local/nginx/logs/nginx.pid

# 发送 USR2 信号,启动新版本的 Master 进程
kill -USR2 <上一步的ID>

Nginx进行平滑升级的实战指南(不中断服务版本更新)

Nginx进行平滑升级的实战指南(不中断服务版本更新)

此时,Nginx 会启动新的 Master 进程,并加载新版本的配置文件(如果上一步为报错则已经替换成功)。旧的 Master 进程仍然在运行,但新的 Master 进程已经启动。

替换二进制文件使用 mv 命令替换或者cp -f强制覆盖

# 使用 mv 替换(避免 "Text file busy" 错误)
mv objs/nginx /usr/local/nginx-1.20.1/sbin/
# 强制覆盖(仍需确保文件未被占用)
cp -f objs/nginx /usr/local/nginx-1.20.1/sbin/

优雅关闭旧版本进程

# 发送 WINCH 信号,逐步关闭旧版本的 Worker 进程
kill -WINCH <上一步的ID>

# 检查进程状态(确认旧 Worker 进程已退出)
ps -ef | grep nginx

Nginx进行平滑升级的实战指南(不中断服务版本更新)

此时旧的会话已经被新Nignx进程替代,在检查新Nginx不影响业务之后,就可以完全停止旧进程了

完全关闭旧版本 Master 进程

# 发送 QUIT 信号,关闭旧版本 Master 进程
kill -QUIT <上一步的ID>

信号作用详解

信号作用执行时机
USR2启动新版本Master进程升级第一步
WINCH逐步关闭旧版本Worker进程新进程正常运行后
QUIT优雅退出旧Master进程业务验证通过后

检查新版本是否运行

Nginx进行平滑升级的实战指南(不中断服务版本更新)

验证版本信息

/usr/local/nginx/sbin/nginx -v

Nginx进行平滑升级的实战指南(不中断服务版本更新)

回滚方案(如升级失败)

如果新版本出现问题,可以通过以下步骤回滚到旧版本:

恢复备份文件

cpjs /usr/local/nginx/sbin/nginx.bak /usr/local/nginx/sbin/nginx

重启旧版本进程

# 向新 Master 进程发送 QUIT 信号(关闭新版本)
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid)
js
# 启动旧版本 Nginx
/usr/local/nginx/sbin/nginx
android

注意事项

  1. 确保编译参数一致
    新版本的 Nginx 必须使用与旧版本相同的编译参数(如模块配置),否则可能导致功能异常。
  2. 避免直接覆盖运行中的文件
    直接使用 cp 覆盖正在运行的 Nginx 二进制文件会导致 Text file busy 错误,必须通过平滑升级流程处理。
  3. 监控日志
    升级后检查 Nginx 日志(/usr/local/nginx/logs/),确保无报错。

以上就是Nginx不中断服务实现版本更新的实战指南的详细内容,更多关于Nginx不中断服务版本更新的资料请关注China编程(www.chinasem.cn)其它相关文章!

这篇关于Nginx进行平滑升级的实战指南(不中断服务版本更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155583

相关文章

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版