当前位置: 代码网 > 服务器>服务器>Linux > Nginx进行平滑升级的实战指南(不中断服务版本更新)

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

2025年08月03日 Linux 我要评论
nginx无缝升级版本,支持及时回滚。升级目的:解决nginx漏洞平滑升级的核心是 不中断服务 的前提下,用新版本的 nginx 替换旧版本。新编译的 objs/nginx 是新版本的二进制文件,需要

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

一.下载并编译新版nginx

1.下载解压

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

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

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/

2.编译

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

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

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

关键步骤

  1. 完整复制 configure arguments: 后的参数
  2. 必须保证新版本配置参数与旧版完全一致
  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成功后如下图:

然后继续执行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 busy。这表明目标文件(nginx 可执行文件)正在被其他进程占用。
解决方法:需要先通过 nginx 平滑升级流程 处理旧进程,确保替换二进制文件时不会冲突。

2.进行平滑升级处理

发送信号启动新版本进程

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

# 发送 usr2 信号,启动新版本的 master 进程
kill -usr2 <上一步的id>

此时,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

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

完全关闭旧版本 master 进程

# 发送 quit 信号,关闭旧版本 master 进程
kill -quit <上一步的id>

信号作用详解

信号作用执行时机
usr2启动新版本master进程升级第一步
winch逐步关闭旧版本worker进程新进程正常运行后
quit优雅退出旧master进程业务验证通过后

检查新版本是否运行

验证版本信息

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

回滚方案(如升级失败)

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

恢复备份文件

cp /usr/local/nginx/sbin/nginx.bak /usr/local/nginx/sbin/nginx

重启旧版本进程

# 向新 master 进程发送 quit 信号(关闭新版本)
kill -quit $(cat /usr/local/nginx/logs/nginx.pid)

# 启动旧版本 nginx
/usr/local/nginx/sbin/nginx

注意事项

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

以上就是nginx不中断服务实现版本更新的实战指南的详细内容,更多关于nginx不中断服务版本更新的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com