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

 更新时间:2025年09月10日 10:36:47   作者: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. 验证新版本状态

  • 检查新版本是否运行:nginx -v(应显示新版本号,如1.29.0);
  • 查看日志无报错:tail -f /usr/local/nginx/logs/error.log;
  • 确认端口在线:netstat -lntup | grep 80(或监听端口)。

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参数(可新增参数,但不能删除原有模块参数),否则会导致功能异常;
  • 避免覆盖运行文件:不要直接使用cp覆盖正在运行的二进制文件,需通过平滑升级流程处理;
  • 监控系统资源:新旧版本同时运行时会占用双倍内存,确保服务器资源充足;
  • 测试环境验证:生产环境升级前,务必在测试环境完成全流程验证,避免突发问题。
./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不关机升级内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Nginx结合Openresty通过Lua+Redis实现动态封禁IP

    Nginx结合Openresty通过Lua+Redis实现动态封禁IP

    为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单,本文主要介绍了Nginx结合Openresty通过Lua+Redis实现动态封禁IP,感兴趣的可以了解一下
    2023-11-11
  • CentOS 7下安装Nginx服务器

    CentOS 7下安装Nginx服务器

    这篇文章主要为大家详细介绍了CentOS 7下安装Nginx服务器的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • nginx实现发布静态资源的方法

    nginx实现发布静态资源的方法

    这篇文章主要介绍了nginx实现发布静态资源的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Nginx中add_header和proxy_set_header的区别及说明

    Nginx中add_header和proxy_set_header的区别及说明

    这篇文章主要介绍了Nginx中add_header和proxy_set_header的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • nginx配置SSL证书实现https服务的方法

    nginx配置SSL证书实现https服务的方法

    这篇文章主要介绍了nginx配置SSL证书实现https服务的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • Nginx编译参数大全 configure参数中文详解

    Nginx编译参数大全 configure参数中文详解

    这篇文章主要介绍了Nginx编译参数大全,Nginx configure参数中文详解,需要的朋友可以参考下
    2014-04-04
  • Nginx反向代理实现支持长连接详解

    Nginx反向代理实现支持长连接详解

    这篇文章主要给大家介绍了关于Nginx反向代理实现支持长连接的相关资料,文字介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-06-06
  • keepalived+Nginx实现高可用集群配置

    keepalived+Nginx实现高可用集群配置

    本文详细介绍了如何使用Keepalived和Nginx搭建高可用集群,包括配置Keepalived为主从模式,利用虚拟IP实现故障切换,以及通过自定义Shell脚本监控Nginx状态,确保服务连续性,感兴趣的可以了解一下
    2026-05-05
  • Nginx配置PATHINFO隐藏thinkphp index.php

    Nginx配置PATHINFO隐藏thinkphp index.php

    这篇文章主要介绍了Nginx配置PATHINFO隐藏thinkphp index.php,本文直接给出配置示例,需要的朋友可以参考下
    2015-07-07
  • Nginx服务器限制访问速度的配置方法

    Nginx服务器限制访问速度的配置方法

    这篇文章主要介绍了Nginx服务器限制访问速度的配置方法,尤其是当服务器中存在ftp下载等服务时尤为有用,需要的朋友可以参考下
    2015-07-07

最新评论