nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Nginx不关机/平滑升级

Nginx不关机升级(平滑升级)的实战指南

作者:m0_46460826

随着 nginx 越来越流行,并且 nginx 的优势也越来越明显,nginx 的版本迭代也来时加速模式,伴随着 nginx 的广泛应用,版本升级必然越来越快,线上业务不能停,所以本文给大家介绍了Nginx不关机升级(平滑升级)的实战指南,需要的朋友可以参考下

一、升级前的准备工作

1.1 备份关键数据

升级前必须备份Nginx的安装目录(如/usr/local/nginx/data/nginx)、配置文件(如/usr/local/nginx/conf/nginx.conf)及日志文件(如/usr/local/nginx/logs/error.log)。例如:
tar -zcvf /data/nginx-backup-$(date +%F).tar.gz /usr/local/nginx/
备份是回滚的核心保障,避免升级失败导致数据丢失。

1.2 确认旧版本信息

执行以下命令获取旧版本的编译参数(关键!新版本需保持一致)和版本号:

nginx -V

1.3 安装编译依赖

确保系统安装了新版本所需的依赖库(如gcc、pcre-devel、openssl-devel):
dnf install -y gcc make zlib-devel pcre-devel openssl-devel wget # RockyLinux/RHEL
yum install -y gcc make zlib-devel pcre-devel openssl-devel wget # CentOS
依赖缺失会导致编译失败。

二、下载并编译新版本Nginx

2.1. 下载新版本源码

访问Nginx官网(nginx.org/download)下载所需版本(如1.22.0),并解压:

wget https://nginx.org/download/nginx-1.22.0.tar.gz
tar -zxvf nginx-1.22.0.tar.gz
cd nginx-1.22.0

2.2 编译新版本

使用旧版本的编译参数执行configure(避免功能冲突),然后编译(不要执行make install,防止覆盖旧版本):

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module # 复用旧参数
make

编译完成后,新版本的二进制文件会生成在objs/nginx目录下。

三、执行平滑升级流程

3.1. 替换旧版本二进制文件

将新编译的objs/nginx复制到旧版本的安装目录(如/usr/local/nginx/sbin/),替换旧的可执行文件:

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old  # 备份旧文件
cp objs/nginx /usr/local/nginx/sbin/nginx  # 替换为新文件

若提示Text file busy错误,说明旧文件正在被进程占用,需先通过后续步骤停止旧进程后再替换。

3.2. 启动新主进程

向旧版本的主进程发送USR2信号,启动新版本的主进程(加载新二进制文件),此时新旧版本的主进程会同时运行:

kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)  # 替换为旧版本的PID

执行后,可通过ps -ef | grep nginx查看,此时有两个主进程(旧版本和新版本)。

3.3. 优雅关闭旧工作进程

向旧版本的主进程发送WINCH信号,逐步关闭旧版本的工作进程(Worker Process),新版本的工作进程会接管请求(确保连接不中断):

kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin)  # 替换为旧主进程的PID

通过ps -ef | grep nginx确认旧工作进程已退出,旧主进程仍在运行(用于回滚)。

3.4. 验证新版本状态

3.5. 结束旧主进程

业务验证无误后,向旧版本的主进程发送QUIT信号,彻底关闭旧版本:

kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)  # 替换为旧主进程的PID

再次执行ps -ef | grep nginx,确认旧进程已全部退出,升级完成。

四、升级失败的回滚操作

若升级后出现异常(如服务中断、功能失效),可快速回滚到旧版本:

4.1. 恢复旧二进制文件

将备份的旧版本二进制文件复制回安装目录:
cp /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx

4.2. 重新加载旧版本

向新版本的主进程发送HUP信号(或直接重启Nginx),拉起旧版本的工作进程:

kill -HUP $(cat /usr/local/nginx/logs/nginx.pid)  # 替换为新主进程的PID(即旧主进程的PID)
或直接重启:  
/usr/local/nginx/sbin/nginx

4.3. 清理旧进程

若旧主进程未自动退出,可发送QUIT信号关闭:
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)
回滚完成后,再次验证服务状态。

tar -zcvf /opt/nginx-$(date +%F).tar.gz /usr/local/nginx/    #备份文件目录+时间  //需要备份的文件目录
wget https://nginx.org/download/nginx-1.22.0.tar.gz
tar -zxvf nginx-1.22.0.tar.gz    #解压缩
./configure \
> --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-http_stub_status_module \
> --with-http_ssl_module
#备份
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_bak
#编译
make
#新文件替换到旧文件路径
cp objs/nginx /usr/local/nginx/sbin/nginx
#
kill -USR2 $(cat /usr/local/nginxlog/nginx.pid)
kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin)
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)

关键注意事项

./configure \
  --prefix=/usr/local/nginx \                  # 安装目录
  --user=nginx \                               # 运行用户(后续会创建)
  --group=nginx \                              # 运行用户组
  --with-http_ssl_module \                     # 启用 HTTPS 模块
  --with-http_v2_module \                      # 启用 HTTP/2 协议(提升性能)
  --with-http_gzip_static_module \             # 启用静态 gzip 压缩
  --with-http_stub_status_module \             # 启用状态监控模块
  --with-pcre \                                # 启用 PCRE 正则支持(rewrite 依赖)
  --with-stream \                              # 启用 TCP 代理模块(如反向代理数据库)
  --with-stream_ssl_module \                   # 启用 TCP 代理的 SSL 支持
  --http-log-path=/var/log/nginx/access.log \  # 访问日志路径
  --error-log-path=/var/log/nginx/error.log \  # 错误日志路径
  --pid-path=/var/run/nginx/nginx.pid \        # PID 文件路径
  --lock-path=/var/lock/nginx.lock             # 锁文件路径
  
注意:
    可根据需求增减模块(如 --without-xxx 禁用不需要的模块)
    企业若需特殊模块(如第三方缓存模块),可通过 --add-module 引入

到此这篇关于Nginx不关机升级(平滑升级)的实战指南的文章就介绍到这了,更多相关Nginx不关机升级内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文