不求甚解

此博客为个人学习之用,如与其他作品雷同,纯属巧合。

导航

零停机的平滑更新 Nginx 版本

Posted on 2025-04-11 11:23  三年三班王小朋  阅读(349)  评论(0)    收藏  举报

平滑更新 Nginx 版本是一种零停机的升级方式,可以确保在升级过程中服务不会中断。

以下是详细的步骤:

1. 准备工作

检查当前 Nginx 版本
确认当前运行的 Nginx 版本:

nginx -v

确认新版本的兼容性
确保新版本的 Nginx 与旧版本的配置文件和模块兼容。

2. 下载并编译新版本

下载新版本
访问 Nginx 官方网站,找到最新稳定版的链接并下载:

wget https://nginx.org/download/nginx-<new-version>.tar.gz

解压 tar 文件
解压下载的新版本:

tar -zxvf nginx-<new-version>.tar.gz
cd nginx-<new-version>

配置编译选项
使用与旧版本相同的编译参数(可以通过 nginx -V 查看旧版本的编译参数):

./configure --prefix=/usr/local/nginx --with-http_ssl_module ...
make

编译源代码
编译新版本的 Nginx:
注意:不要执行 make install,因为这会覆盖旧版本的二进制文件。

3. 备份旧版本的二进制文件

将旧版本的 Nginx 可执行文件备份,以便出现问题时可以回滚:

sudo cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old

4. 替换二进制文件

停止旧版本的工作进程
发送 USR2 信号给旧版本的主进程,让它启动一个新的主进程,并加载新版本的二进制文件:

sudo kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)

替换二进制文件
将新版本的二进制文件复制到旧版本的位置:

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

ps:如果报错connot create regular file‘。。。’Text file busy,可以使用mv命令

sudo mv objs/nginx /usr/local/nginx/sbin/nginx

验证新版本
检查新版本是否已经启动:

ps aux | grep nginx

你会看到两个主进程:一个旧版本的主进程和一个新版本的主进程。

5. 优雅地关闭旧版本

关闭旧版本的工作进程
发送 WINCH 信号给旧版本的主进程,让它优雅地关闭所有旧版本的工作进程:

sudo kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin)

确认旧版本的工作进程已关闭
退出旧版本的主进程
如果确认新版本运行正常,可以完全退出旧版本的主进程:

sudo kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)

6. 验证升级结果

检查 Nginx 版本
确认当前运行的 Nginx 是新版本:

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

测试服务
确保你的网站或应用正常运行,没有异常。

7. 回滚(如果需要)

如果在升级过程中出现问题,可以通过以下步骤回滚到旧版本:

恢复旧版本的二进制文件

sudo cp /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx

重新加载旧版本
发送 HUP 信号重新加载旧版本:

sudo kill -HUP $(cat /usr/local/nginx/logs/nginx.pid)

 


注意事项

配置文件兼容性:确保新版本的 Nginx 支持旧版本的配置文件。
模块兼容性:如果你使用了第三方模块,确保它们与新版本兼容。
系统依赖:检查新版本的依赖库(如 OpenSSL、PCRE 等)是否满足要求。
通过以上步骤,你可以实现 Nginx 的平滑升级,无需停止服务。