本文主要是介绍Nginx进行平滑升级的实战指南(不中断服务版本更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新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
一样.
关键步骤:
- 完整复制 configure arguments: 后的参数
- 必须保证新版本配置js参数与旧版完全一致
- 特别注意第三方模块路径(如 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 busChina编程y。这表明目标文件(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
回滚方案(如升级失败)
如果新版本出现问题,可以通过以下步骤回滚到旧版本:
恢复备份文件
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
注意事项
- 确保编译参数一致
新版本的 Nginx 必须使用与旧版本相同的编译参数(如模块配置),否则可能导致功能异常。 - 避免直接覆盖运行中的文件
直接使用cp
覆盖正在运行的 Nginx 二进制文件会导致Text file busy
错误,必须通过平滑升级流程处理。 - 监控日志
升级后检查 Nginx 日志(/usr/local/nginx/logs/
),确保无报错。
以上就是Nginx不中断服务实现版本更新的实战指南的详细内容,更多关于Nginx不中断服务版本更新的资料请关注China编程(www.chinasem.cn)其它相关文章!
这篇关于Nginx进行平滑升级的实战指南(不中断服务版本更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!