Nginx平滑升级(不停服务)的完整流程

 更新时间:2026年06月11日 08:38:58   作者:流烟默  
这篇文章主要介绍了Nginx平滑升级实践,从https://nginx.org/en/download.html下载并升级Nginx至最新版本,确保配置正确并平滑升级以避免服务中断,此过程包括解压、备份、编译新版本、平滑升级和验证步骤,需要的朋友可以参考下

从 https://nginx.org/en/download.html 下载最新稳定版本nginx-1.30.2.tar.gz,上传到了 /home/nginx目录下。原服务器Nginx是1.21.6版本,且configure没有模块参数

configure arguments: 是空白的,说明当时安装时没有加任何模块参数。可以使用-V命令检测参数,如果有参数则需要在configure 时附带。

[root@host nginx]# ./sbin/nginx -V
nginx version: nginx/1.21.6
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
configure arguments:

注意:升级后检测是否有worker进程是否存在,如果不存在重新加载:

# 升级完成后
/usr/local/nginx/sbin/nginx -s reload

完整升级步骤

第一步:解压

cd /home/nginx
tar -zxvf nginx-1.30.2.tar.gz

第二步:备份当前环境

# 备份配置文件
cp -r /usr/local/nginx/conf /usr/local/nginx/conf.bak.$(date +%Y%m%d)

# 备份旧二进制文件
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak.$(date +%Y%m%d)

# 记录旧版本信息
/usr/local/nginx/sbin/nginx -V > /root/nginx_old_info.txt

# 确认备份成功
ls -la /usr/local/nginx/conf.bak.$(date +%Y%m%d)
ls -la /usr/local/nginx/sbin/nginx.bak.$(date +%Y%m%d)

第三步:编译新版本

# 进入解压目录
cd /home/nginx/nginx-1.30.2

# 清理可能存在的编译残留
make clean 2>/dev/null

# 配置编译参数(旧版本没有额外参数,直接默认即可)
./configure

# 编译
make

第四步:平滑升级(不中断服务)

# 查看当前 nginx master 进程 PID
cat /usr/local/nginx/logs/nginx.pid

# 替换二进制文件
cp -f objs/nginx /usr/local/nginx/sbin/nginx

# 向 master 进程发送 USR2 信号,启动新版本 worker
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)

# 等待2秒让新进程启动
sleep 2

# 向旧 master 发送 WINCH 信号,优雅关闭旧 worker
kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid)

第五步:验证升级结果

# 查看版本号(应显示 1.30.2)
/usr/local/nginx/sbin/nginx -V

# 测试配置文件语法
/usr/local/nginx/sbin/nginx -t

# 查看 nginx 进程
ps aux | grep nginx | grep -v grep

# 测试业务是否正常
curl -I http://127.0.0.1 2>/dev/null | head -5

第六步:确认无误后,清理旧进程

# 确认新版本正常工作后,关闭旧 master 进程
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)

# 清理旧 PID 文件
rm -f /usr/local/nginx/logs/nginx.pid.oldbin

# 最终确认进程状态
ps aux | grep "nginx:" | grep -v grep

快速回滚方案(如果升级失败)

# 停止当前 nginx
/usr/local/nginx/sbin/nginx -s stop

# 恢复旧二进制
cp /usr/local/nginx/sbin/nginx.bak.$(date +%Y%m%d) /usr/local/nginx/sbin/nginx

# 启动旧版本
/usr/local/nginx/sbin/nginx

# 验证
/usr/local/nginx/sbin/nginx -V

一键执行脚本(可选)

你可以将以下内容保存为 upgrade_nginx.sh,然后执行 bash upgrade_nginx.sh

#!/bin/bash

set -e

echo "=== 1. 解压 ==="
cd /home/nginx
tar -zxvf nginx-1.30.2.tar.gz

echo "=== 2. 备份 ==="
cp -r /usr/local/nginx/conf /usr/local/nginx/conf.bak.$(date +%Y%m%d)
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak.$(date +%Y%m%d)

echo "=== 3. 编译 ==="
cd /home/nginx/nginx-1.30.2
make clean 2>/dev/null
./configure
make

echo "=== 4. 平滑升级 ==="
cp -f objs/nginx /usr/local/nginx/sbin/nginx
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)
sleep 2
kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid)

echo "=== 5. 验证 ==="
/usr/local/nginx/sbin/nginx -V
/usr/local/nginx/sbin/nginx -t

echo "=== 6. 清理旧进程 ==="
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin) 2>/dev/null
rm -f /usr/local/nginx/logs/nginx.pid.oldbin

echo "=== 升级完成 ==="

使用make upgrade替代三个kill

# 1. 进入新版本源码目录
cd /home/nginx/nginx-1.30.2

# 2. 用旧版本的编译参数配置(你的情况是空参数)
./configure

# 3. 编译(不要 make install!)
make

# 4. 备份旧二进制
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

# 5. 替换二进制文件
cp -f objs/nginx /usr/local/nginx/sbin/nginx

# 6. 自动完成平滑升级(这一步替代了你之前所有的 kill 命令)
make upgrade

# 7. 验证版本
/usr/local/nginx/sbin/nginx -V

以上就是Nginx平滑升级(不停服务)的完整流程的详细内容,更多关于Nginx平滑升级(不停服务)的资料请关注脚本之家其它相关文章!

相关文章

  • nginx expires控制页面缓存

    nginx expires控制页面缓存

    expires 指令可以控制 HTTP 应答中的“Expires ”和“ Cache-Control ”的头标(起到控制页面缓存的作用)
    2013-01-01
  • 对nginx-naxsi白名单规则详解

    对nginx-naxsi白名单规则详解

    今天小编就为大家分享一篇对nginx-naxsi白名单规则详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • nginx配置反向代理时遇到的路径问题

    nginx配置反向代理时遇到的路径问题

    这篇文章主要介绍了nginx配置反向代理时遇到的路径问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • nginx获取客户端真实ip的常用方法

    nginx获取客户端真实ip的常用方法

    这篇文章给大家介绍了在nginx中获取客户端真实IP的两种常用方法,文中有详细的代码供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2023-09-09
  • Nginx代理proxy pass配置去除前缀的实现

    Nginx代理proxy pass配置去除前缀的实现

    这篇文章主要介绍了Nginx代理proxy pass配置去除前缀的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Nginx代理接口访问返回404的实现示例

    Nginx代理接口访问返回404的实现示例

    因为不同业务系统间有接口调用,存在跨域问题,为了解决同源策略,需要将接口通过nginx去转发,本文主要介绍了Nginx代理接口访问返回404的实现示例,感兴趣的可以了解一下
    2024-06-06
  • lua+nginx实现黑名单禁止访问的示例代码

    lua+nginx实现黑名单禁止访问的示例代码

    本文介绍如何使用Nginx与Lua脚本通过OpenResty平台实现高效的IP黑名单功能,利用Redis存储黑名单,定时更新共享内存字典,防止恶意IP访问,感兴趣的可以了解一下
    2025-11-11
  • 详解Nginx服务器中HTTP Headers相关的模块配置使用

    详解Nginx服务器中HTTP Headers相关的模块配置使用

    这篇文章主要介绍了详解Nginx服务器中HTTP Headers相关的模块配置使用,包括ngx_http_headers_module与它的增强版ngx_headers_more的配置使用讲解,需要的朋友可以参考下
    2016-01-01
  • nginx全局变量整理小结

    nginx全局变量整理小结

    nginx全局变量整理小结,方便需要的朋友
    2012-11-11
  • Nginx简要安装配置方法图文教程

    Nginx简要安装配置方法图文教程

    这篇文章主要以图文结合的方式为大家详细介绍了Nginx简要安装配置方法教程,感兴趣的小伙伴们可以参考一下
    2016-05-05

最新评论