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不关机升级内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • centos系统下LNMP环境一键安装

    centos系统下LNMP环境一键安装

    centos下的LNMP环境一键安装实现方法,需要的朋友可以参考下。
    2010-06-06
  • 前端项目中Nginx配置指南详解

    前端项目中Nginx配置指南详解

    这篇文章主要为大家详细介绍了在前端项目开发中如何配置Nginx,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-09-09
  • 利用nginx访问日志如何记录mysql中的用户id详解

    利用nginx访问日志如何记录mysql中的用户id详解

    这篇文章主要给大家介绍了关于利用nginx访问日志如何记录mysql中用户id的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-07-07
  • 解决nginx+lua搭建文件上传下载服务问题

    解决nginx+lua搭建文件上传下载服务问题

    这篇文章主要介绍了nginx+lua搭建文件上传下载服务,涉及到nginx安装配置方法,本文通过代码给大家介绍的非常详细,需要的朋友可以参考下
    2017-12-12
  • nginx部署.net core站点的方法

    nginx部署.net core站点的方法

    这篇文章主要介绍了nginx部署.net core站点的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • nginx中共享内存的使用详解

    nginx中共享内存的使用详解

    这篇文章主要介绍了nginx中共享内存的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • Nginx转发丢失cookie表现形式及解决方案

    Nginx转发丢失cookie表现形式及解决方案

    本文主要介绍了Nginx转发丢失cookie表现形式及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • nginx网页缓存时间的配置过程

    nginx网页缓存时间的配置过程

    Nginx缓存的设置可以提高网站性能,对于网站的图片,尤其是新闻网站,下面这篇文章主要给大家介绍了关于nginx网页缓存时间的配置过程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • Nginx 动态域名解析过程详解

    Nginx 动态域名解析过程详解

    这篇文章主要为大家介绍了Nginx 动态域名解析过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 负载均衡下的webshell上传+nginx解析漏洞的过程

    负载均衡下的webshell上传+nginx解析漏洞的过程

    这篇文章主要介绍了负载均衡下的webshell上传+nginx解析漏洞,首先介绍了负载均衡下webshell上传的四大难点及环境搭建教程,感兴趣的朋友跟随小编一起看看吧
    2024-02-02

最新评论