Lake's Blog Lake's Blog
首页
HCFrame
  • 博客搭建

    • 搜索引擎
    • SEO优化
    • 问题记录
  • Vue

    • 问题记录
  • uni-app
  • 开发

    • Spring
  • 数据库及中间件

    • Elasticsearch
    • SQL
  • 杂谈

    • 杂谈
  • 微服务

    • nacos
    • CAS
  • 算法说明

    • algorithm
  • leetCode

    • leetCode
  • 代理

    • Nginx
  • Linux

    • ubuntu
  • Docker
  • 数据库
  • 消息队列
  • openwrt
  • 友情链接
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub

Lake Liu

很菜的程序员
首页
HCFrame
  • 博客搭建

    • 搜索引擎
    • SEO优化
    • 问题记录
  • Vue

    • 问题记录
  • uni-app
  • 开发

    • Spring
  • 数据库及中间件

    • Elasticsearch
    • SQL
  • 杂谈

    • 杂谈
  • 微服务

    • nacos
    • CAS
  • 算法说明

    • algorithm
  • leetCode

    • leetCode
  • 代理

    • Nginx
  • Linux

    • ubuntu
  • Docker
  • 数据库
  • 消息队列
  • openwrt
  • 友情链接
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub
  • 代理

    • Nginx

      • 学习Nginx,你一定要知道这些
      • Linux编译安装Nginx1.16.1稳定版
      • Linux下Nginx1.16.1平滑升级至1.18.0及升级失败如何退回
        • 一、首先确认当前已经安装Nginx
        • 二、下载Nginx 1.18.0
        • 三、获取旧版本的安装编译命令
        • 四、编译
        • 五、平滑升级
          • 1. 首先备份nginx二进制可执行程序
          • 2. 查看nginx版本
          • 3. 找到nginx-1.18.0新版本的nginx的二进制执行程序
          • 4. 使用nginx-1.18.0的二进制文件将nginx-1.16.1的二进制文件进行强制覆盖
          • 5. 设定旧的服务不再接收用户请求(下线),新服务启动子进程接收用户请求(上线)
          • 6. 进行旧服务进程的关闭
          • 7. 查看当前nginx的版本
        • 六、如何退回到1.16.1版本
          • 1. 将旧版本的nginx二进制文件强行覆盖
          • 2. 向旧版本nginx进程发送HUP信号
          • 3. 让新版本的服务停止接收用户请求
          • 4. 进行新版本服务进程的关闭
          • 5. kill掉新版本nginx进程
        • 参考文章
      • 快速配置Nginx反向代理HTTP协议
      • 快速配置Nginx转发TCP和UDP协议
  • linux

  • Docker

  • 数据库

  • 消息队列

Linux下Nginx1.16.1平滑升级至1.18.0及升级失败如何退回

# Linux下Nginx1.16.1升级至1.18.0

前置条件

本文采用centOS 7.8.2003 版本

通过编译的方式升级

如何平滑的升级Nginx 1.16.1到1.18.0版本,及升级失败后如何退回

# 一、首先确认当前已经安装Nginx

ps -ef|grep nginx
1

image-20210115163443330

# 二、下载Nginx 1.18.0

# 下载
wget http://nginx.org/download/nginx-1.18.0.tar.gz
# 移动至目标文件夹
mv nginx-1.18.0.tar.gz /usr/local/src/
cd /usr/local/src/
# 解压
tar -zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
1
2
3
4
5
6
7
8

# 三、获取旧版本的安装编译命令

注意

下面命令中 /usr/local/nginx/sbin/nginx 是我的nginx安装路径

若路径不一致可根据实际情况进行修改

/usr/local/nginx/sbin/nginx -V
1

image-20210115164227414

  • 此处我们得到了编译参数为
--prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream
1

注意

编译参数可能有出入,此处请根据实际情况替换成你自己获取的参数

# 四、编译

  • 此处./configure 后面的命令为上面获取的编译参数,若想了解此文章的参数具体含义可以点击此处
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream
1

image-20210115164756617

注意

有些人可能有疑惑,新下载的nginx在执行./configure的时候--prefix指定的目录是需要指向旧的nginx所指向的prefix目录还是随便指向一个就行,答案是需要指向旧版本的nginx的安装目录

  • 执行make命令
make
1

注意

注意执行完成后不要执行make install命令

# 五、平滑升级

# 1. 首先备份nginx二进制可执行程序

cd /usr/local/nginx/sbin/
cp nginx{,.bak}
1
2

image-20210115165418236

# 2. 查看nginx版本

./nginx -V
1

image-20210115165531993

# 3. 找到nginx-1.18.0新版本的nginx的二进制执行程序

cd /usr/local/src/nginx-1.18.0/objs
1

image-20210115165738521

上面的这个nginx就是我们要拿到的新版本的nginx可执行程序文件。

# 4. 使用nginx-1.18.0的二进制文件将nginx-1.16.1的二进制文件进行强制覆盖

cp -f nginx /usr/local/nginx/sbin/nginx
1

image-20210115165950374

# 5. 设定旧的服务不再接收用户请求(下线),新服务启动子进程接收用户请求(上线)

ps aux | grep nginx
1

image-20210115170502120

  • 找到nginx父进程的pid号,现在对其发送USR2信号
kill -USR2 6084 #设定新的子进程开始接收用户的访问请求,旧的不再接受用户的访问请求
1
  • 再次查看进程
ps aux | grep nginx
1

image-20210115170722930

现在是nginx的新老版本的进程共存的一种情况。虽然现在旧版本的nginx进程还存在,但是已经不再接受用户的请求了。除此之外,旧版本的nginx进程也依然处于监听的状态,我们通过lsof命令可以看到,此处端口号为父进程端口号

image-20210115170839128

虽然在监听,但实际不会处理新连接,因为fd已经从epoll中移出了。另外,旧master是新master的父进程,所以新master才能共享打开的监听端口。保留旧版本的master是为了方便回滚(当然你可以发信号QUIT或者直接杀掉进程)

# 6. 进行旧服务进程的关闭

kill -WINCH 6084                     # 进行旧服务进程的关闭,该pid号是旧版本的nginx的master进程的pid号
1
  • 再次查看当前nginx进程
ps aux | grep nginx
1

image-20210115171220531

可以看到现在的旧版本的nginx的worker进程已经全部被杀死了,只剩下的旧版本nginx的master进程 确定升级没有任何问题的话,那么现在我们可以把这个master进程给杀死掉。可以用kill -QUIT把旧master进程杀掉。方法已经教给大家了,但是这里我先不杀死,因为我还要往下演示如何回退。

# 7. 查看当前nginx的版本

/usr/local/nginx/sbin/nginx -V
1

image-20210115171348077

可以看到现在已经升级成功了。 还可以访问一下

image-20210115171439488

# 六、如何退回到1.16.1版本

这种情况主要是用于当新版本的nginx升级失败之后,我们立马回退到旧版本的nginx

# 1. 将旧版本的nginx二进制文件强行覆盖

cd /usr/local/nginx/sbin/
mv nginx.bak  nginx
1
2
  • 查看进程
ps aux | grep nginx
1

image-20210115171732253

# 2. 向旧版本nginx进程发送HUP信号

kill -HUP 6084                              #注意这是旧版本的nginx进程pid号
1

说明

这个命令就相当与reload指令的作用,把旧的nginx的worker进程拉起来,但是咱们并不是直接使用reload的方式来执行,而是发送HUP信号,它会在没有worker进程时启动worker进程,这点需要注意一下。

  • 此时再次查看进程
ps aux | grep nginx
1

image-20210115171959495

发现多了worker进程,多出来的部分是旧版本的nginx进程。

# 3. 让新版本的服务停止接收用户请求

kill -USR2 31276
1

此时,接收用户请求的是旧版本的nginx进程。新版本的nginx进程不再接受用户请求

# 4. 进行新版本服务进程的关闭

kill -WINCH 31276
1
  • 查看一下进程
ps aux | grep nginx
1

image-20210115172333411

现在,旧版本已经回退成功了,我们可以把新版本的nginx的master进程发送QUIT进程将其退出。

# 5. kill掉新版本nginx进程

kill -QUIT 31276
1
ps aux | grep nginx
1

image-20210115172511809

  • 再次查看一下版本
./nginx  -V
1

image-20210115172609987

退回成功

# 参考文章

nginx版本升级:从nginx1.16.1升级到nginx1.18.0,以及升级失败如何回退

编辑
#nginx
上次更新: 2023/03/24, 08:53:10
Linux编译安装Nginx1.16.1稳定版
快速配置Nginx反向代理HTTP协议

← Linux编译安装Nginx1.16.1稳定版 快速配置Nginx反向代理HTTP协议→

最近更新
01
IDEA行号太宽
03-11
02
uniapp中实现h5扫码功能(微信版)
08-12
03
Docker安装Rabbitmq
07-22
更多文章>
本站总访问量次 | 您是本站第位访问者
Theme by Vdoing | Copyright © 2020-2024 Lake Liu | MIT License | 背景图、Logo、头像设计@Drrizzee
  • 跟随系统
  • 深色模式
  • 浅色模式
  • 阅读模式