当前位置: 首页 > news >正文

n3.平滑升级和回滚

平滑升级和回滚

      • 1. 平滑升级流程
      • 2. 平滑升级和回滚案例

有时候我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时 Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级

1. 平滑升级流程

  • 平滑升级四个阶段
  • 只有旧版nginx的master和worker进程
  • 旧版和新版nginx的master和worker进程并存,由旧版nginx接收处理用户的新请求
  • 旧版和新版nginx的master和worker进程并存,由新版nginx接收处理用户的新请求
  • 只有新版nginx的master和worker进程
将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
向master进程发送USR2信号启动新nginx进程
master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
master进程用新Nginx文件启动新master进程及worker子进程成为旧master的子进程
系统中将有新旧两个Nginx主进程和对应的worker子进程并存
当前新的请求仍然由旧Nginx的worker进程进行处理
将新生成的master进程的PID存放至新生成的pid文件nginx.pid
向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
向旧master进程发送QUIT信号,关闭旧master,并删除Nginx.pid.oldbin文件
如果发现升级有问题,可以回滚∶向旧master发送HUP,向新master发送QUIT

2. 平滑升级和回滚案例

# 在nginx编译安装的基础上(可以参考编译安装脚本)
# 下载最新稳定版
[root@Ubuntu2204 ~]#wget https://nginx.org/download/nginx-1.26.1.tar.gz
[root@Ubuntu2204 ~]#tar xvf nginx-1.26.1.tar.gz
[root@Ubuntu2204 ~]#cd nginx-1.26.1/# 查看当前使用的版本及编译选项
[root@Ubuntu2204 nginx-1.26.1]#nginx -V
nginx version: nginx/1.22.1
built by gcc 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) 
built with OpenSSL 3.0.2 15 Mar 2022
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module# configure arguments后面是以前编译时的参数。现在编译使用一样的参数# 开始编译新版本
[root@Ubuntu2204 nginx-1.26.1]#./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module# 只要make无需要make install
[root@Ubuntu2204 nginx-1.26.1]#objs/nginx -v
nginx version: nginx/1.26.1# 查看两个版本
[root@Ubuntu2204 nginx-1.26.1]#ll objs/nginx /apps/nginx/sbin/nginx
-rwxr-xr-x 1 nginx nginx 5884536 Jul 12 09:43 /apps/nginx/sbin/nginx*
-rwxr-xr-x 1 root  root  6013648 Jul 12 10:04 objs/nginx*# 把之前的旧版的nginx命令备份
[root@Ubuntu2204 nginx-1.26.1]#cp /apps/nginx/sbin/nginx /opt/nginx.old# 把新版本的nginx命令复制过去覆盖旧版本程序文件,注意:需要加 -f 选项强制覆盖,否则会提示Text file busy
[root@Ubuntu2204 nginx-1.26.1]#cp -f ./objs/nginx /apps/nginx/sbin/# 检测一下有没有问题
[root@Ubuntu2204 nginx-1.26.1]#/apps/nginx/sbin/nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful# 发送信号USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx
# 此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80
# 此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。
[root@Ubuntu2204 nginx-1.26.1]#kill -USR2 `cat /apps/nginx/logs/nginx.pid`# 可以看到两个master,新的master是旧版master的子进程,并生成新版的worker进程
[root@Ubuntu2204 ~]#ps auxf | grep nginx
root         904  0.0  0.0  10168   944 ?        Ss   09:48   0:00 nginx: master process /apps/nginx/sbin/nginx
nginx        906  0.0  0.1  10904  3684 ?        S    09:48   0:00  \_ nginx: worker process
root        5234  0.0  0.3  10188  6416 ?        S    10:15   0:00  \_ nginx: master process /apps/nginx/sbin/nginx
nginx       5235  0.0  0.1  10924  3716 ?        S    10:15   0:00      \_ nginx: worker process
root        5240  0.0  0.1   6480  2240 pts/1    S+   10:16   0:00  |       \_ grep --color=auto nginx[root@Ubuntu2204 ~]#lsof -i :80
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx    904  root    6u  IPv4  31463      0t0  TCP *:http (LISTEN)
nginx    906 nginx    6u  IPv4  31463      0t0  TCP *:http (LISTEN)
nginx   5234  root    6u  IPv4  31463      0t0  TCP *:http (LISTEN)
nginx   5235 nginx    6u  IPv4  31463      0t0  TCP *:http (LISTEN)# 先关闭旧nginx的worker进程,而不关闭nginx主进程方便回滚
# 向原Nginx主进程发送WINCH信号,它会逐步关闭旗下的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理
[root@Ubuntu2204 nginx-1.26.1]#kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`# 如果旧版worker进程有用户的请求,会一直等待处理完后才会关闭
[root@Ubuntu2204 ~]#ps auxf | grep nginx
root         904  0.0  0.0  10168   944 ?        Ss   09:48   0:00 nginx: master process /apps/nginx/sbin/nginx
root        5234  0.0  0.3  10188  6416 ?        S    10:15   0:00  \_ nginx: master process /apps/nginx/sbin/nginx
nginx       5235  0.0  0.1  10924  3716 ?        S    10:15   0:00      \_ nginx: worker process##################### 注意:此处如果是虚拟机先做快照方便回滚 ##################### 经过一段时间测试,新版本服务没问题,最后发送QUIT信号,退出老的master
[root@Ubuntu2204 nginx-1.26.1]#kill -QUIT `cat /apps/nginx/logs/nginx.pid.oldbin`# 查看版本是不是已经是新版了
[root@Ubuntu2204 nginx-1.26.1]#nginx -v
nginx version: nginx/1.26.1
[root@Ubuntu2204 nginx-1.26.1]#curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.26.1
Date: Fri, 12 Jul 2024 02:28:11 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Fri, 12 Jul 2024 01:43:39 GMT
Connection: keep-alive
ETag: "66908a4b-267"
Accept-Ranges: bytes
# 回滚 (虚拟机恢复之前做的快照)
[root@Ubuntu2204 ~]#ps aux | grep nginx
root         904  0.0  0.0  10168   944 ?        Ss   09:51   0:00 nginx: master process /apps/nginx/sbin/nginx
root        5234  0.0  0.3  10188  6416 ?        S    10:18   0:00 nginx: master process /apps/nginx/sbin/nginx
nginx       5235  0.0  0.1  10924  3716 ?        S    10:18   0:00 nginx: worker process
root        5659  0.0  0.1   6612  2252 pts/3    S+   10:31   0:00 grep --color=auto nginx# 如果升级的版本发现问题需要回滚,可以发送HUP信号,重新拉起旧版本的worker
[root@Ubuntu2204 ~]#kill -HUP `cat /apps/nginx/logs/nginx.pid.oldbin`[root@Ubuntu2204 ~]#ps aux | grep nginx
root         904  0.0  0.0  10168   944 ?        Ss   09:51   0:00 nginx: master process /apps/nginx/sbin/nginx
root        5234  0.0  0.3  10188  6416 ?        S    10:18   0:00 nginx: master process /apps/nginx/sbin/nginx
nginx       5235  0.0  0.1  10924  3716 ?        S    10:18   0:00 nginx: worker process
nginx       5661  0.0  0.1  10904  3684 ?        S    10:32   0:00 nginx: worker process
root        5663  0.0  0.1   6612  2240 pts/3    S+   10:32   0:00 grep --color=auto nginx[root@Ubuntu2204 ~]#pstree -p | grep nginx|-nginx(904)-+-nginx(5234)---nginx(5235)|            `-nginx(5661)# 最后关闭新版的master
[root@Ubuntu2204 ~]#kill -QUIT `cat /apps/nginx/logs/nginx.pid`# 恢复旧版的文件
[root@Ubuntu2204 ~]#mv /opt/nginx.old /apps/nginx/sbin/nginx

相关文章:

n3.平滑升级和回滚

平滑升级和回滚 1. 平滑升级流程2. 平滑升级和回滚案例 有时候我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时 Nginx又在跑着业务无法停掉,这时我们就可能选择平滑升级 1. 平滑升级流程 平…...

C#WPF DialogHost.Show 弹出对话框并返回数据

在WPF中,使用DialogHost.Show方法显示一个对话框并获取返回数据,你需要定义一个对话框,并在对话框关闭时返回数据。以下是一个简单的例子: 首先,在主窗口中添加DialogHost控件: <MaterialDesign:DialogHost x:Name="dialogHost" /> 然后,创建一个对话…...

Kafka Producer发送消息流程之分区器和数据收集器

文章目录 1. Partitioner分区器2. 自定义分区器3. RecordAccumulator数据收集器 1. Partitioner分区器 clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java&#xff0c;中doSend方法&#xff0c;记录了生产者将消息发送的流程&#xff0c;其中有一步…...

Codeforces Round 958 (Div. 2)

C o d e f o r c e s R o u n d 958 ( D i v . 2 ) \Huge{Codeforces Round 958 (Div. 2)} CodeforcesRound958(Div.2) 文章目录 Problems A. Split the Multiset题意思路标程 Problems B. Make Majority题意思路标程 Problems C. Increasing Sequence with Fixed OR题意思路标…...

<数据集>猫狗识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3686张 标注数量(xml文件个数)&#xff1a;3686 标注数量(txt文件个数)&#xff1a;3686 标注类别数&#xff1a;2 标注类别名称&#xff1a;[cat, dog] 序号类别名称图片数框数1cat118811892dog24982498 使用标…...

Figma 中文版指南:获取和安装汉化插件

Figma是一种主流的在线团队合作设计工具&#xff0c;也是一种基于 Web 端的设计工具。在当今的设计时代&#xff0c;Figma 的使用满足了每个人的设计需求&#xff0c;不仅可以实现在线编辑&#xff0c;还可以方便日常管理&#xff0c;有效提高工作效率。然而&#xff0c;相信很…...

用c语言写一个贪吃蛇游戏

贪吃蛇游戏通常涉及到终端图形编程和简单的游戏逻辑。以下是一个基本的实现示例&#xff0c;包括贪吃蛇的移动、食物生成、碰撞检测等功能。 1. 贪吃蛇游戏的基本结构 贪吃蛇游戏可以分为以下几个部分&#xff1a; 游戏地图和终端绘制&#xff1a;使用二维数组表示游戏地图&am…...

计算机网络入门 --网络模型

计算机网络入门 --网络模型 1.OSI七层模型 1.1 模型概念 OSI七层模型是将计算机网络通信协议划分为七个不同层次的标准化框架&#xff0c;每一层都负责不同功能&#xff0c;并从物理连接层开始处理。OSI七层网络模型如下分别为&#xff1a;物理层、数据链路层、网络层、传输…...

陪玩系统小程序模式APP小程序H5系统搭建开发

随着移动互联网的营及和游戏行业的蓬轨发展&#xff0c;陪玩服务应远而生并迅速唱起&#xff0c;陪玩系统小程序作为连接游戏玩家与陪玩师的桥梁&#xff0c;其模式系统的搭建与开发是得尤为重要&#xff0c;本文将洋细凰述陪玩系统小程宗模式系统的搭建开发流程&#xff0c;包…...

算法训练营day72

题目&#xff1a;117. 软件构建 (kamacoder.com) #include<iostream> #include<unordered_map> #include<vector> #include<queue>using namespace std;int main() {int n, m;cin >> n >> m;vector<int> indegree(n, 0);unordered_…...

C语言------指针讲解(2)

目录 一、数组名的理解 二、使用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组模拟二维数组 一、数组名的理解 通过学习&#xff0c;我们知道&#xff1a;数组名和数组首元素的地址打印出来的结果一模一样&#xff0c;数组…...

大数据技术基础

一、大数据平台 1.大数据平台方案步骤&#xff1a; ①市场上有哪些大数据平台 ②硬件、系统、业务增长等方面 ③方案是否通过 通过后&#xff1a;按照一期目标投入 先虚拟环境部署联系&#xff0c;再实际部署 《大数据架构介绍》《Hadoop架构解析》《Hadoop集群规划》 《H…...

【文心智能体】前几天百度热搜有一条非常有趣的话题《00后疯感工牌》,看看如何通过低代码工作流方式实现图片显示

00后疯感工牌体验&#xff1a;https://mbd.baidu.com/ma/s/6yA90qtM 目录 前言比赛推荐工作流创建工作流入口创建工作流界面工作流界面HTTP工具卡点地方 总结推荐文章 前言 前几天百度热搜有一条非常有有趣《00后疯感工牌》。 想着通过文心智能体去一键生成00后疯感工牌是不是…...

C++20中的constinit说明符

constinit说明符断言(assert)变量具有静态初始化&#xff0c;即零初始化和常量初始化(zero initialization and constant initialization)&#xff0c;否则程序格式不正确(program is ill-formed)。 constinit说明符声明具有静态或线程存储持续时间(thread storage duration)的…...

Java 中的正则表达式

转义字符由反斜杠\x组成&#xff0c;用于实现特殊功能当想取消这些特殊功能时可以在前面加上反斜杠\ 例如在Java中当\出现时是转义字符的一部分&#xff0c;具有特殊意义&#xff0c;前面加一个反斜可以取消其特殊意义&#xff0c;表示1个普通的反斜杠\&#xff0c;\\\\表示2个…...

华为配置蓝牙终端定位实验

个人主页&#xff1a;知孤云出岫 目录 配置蓝牙终端定位示例 业务需求 组网需求 数据规划 配置思路 配置注意事项 操作步骤 配置文件 配置蓝牙终端定位示例 组网图形 图1 配置蓝牙终端定位示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业…...

搭建hadoop+spark完全分布式集群环境

目录 一、集群规划 二、更改主机名 三、建立主机名和ip的映射 四、关闭防火墙(master,slave1,slave2) 五、配置ssh免密码登录 六、安装JDK 七、hadoop之hdfs安装与配置 1)解压Hadoop 2)修改hadoop-env.sh 3)修改 core-site.xml 4)修改hdfs-site.xml 5) 修改s…...

pytorch-pytorch之LSTM

目录 1. nn.LSTM2. nn.LSTMCell 1. nn.LSTM 初始化函数输入参数与RNN相同&#xff0c;分别是input_size&#xff0c;hidden_size和num_layer foward函数也与RNN类似&#xff0c;只不过返回值除了out外&#xff0c;ht变为(ht,ct) 代码见下图&#xff1a; 2. nn.LSTMCell 初…...

jvm优化

1.jvm组成 什么是jvm&#xff0c;java是跨平台语言&#xff0c;对不同的平台&#xff08;windos&#xff0c;linux&#xff09;&#xff0c;有不同的jvm版本。jvm屏蔽了平台的不同&#xff0c;提供了统一的运行环境&#xff0c;让java代码无需考虑平台的差异。 jdk包含jre包含…...

网络安全——防御课实验二

在实验一的基础上&#xff0c;完成7-11题 拓扑图 7、办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 首先&#xff0c;按照之前的操作&#xff0c;创建新的安全区&#xff08;电信和移动&#xff09;分别表示两个外网…...

朴素模式匹配算法与KMP算法(非重点)

目录 一. 朴素模式匹配算法1.1 什么是字符串的匹配模式1.2 朴素模式匹配算法1.3 通过数组下标实现朴素模式匹配算法 二. KMP算法2.1 算法分析2.2 用代码实现&#xff08;只会出现在选择题&#xff0c;考察代码的概率不大&#xff09; 三. 手算next数组四. KMP算法的进一步优化4…...

[k8s源码]2.CURD deployment

加载kubernetes配置 使用 clientcmd方法&#xff0c;是通过"k8s.io/client-go/tools/clientcmd"包加载的。这个函数返回的是config和error两个值。可以看到返回的config是一个指针变量。 func clientcmd.BuildConfigFromFlags(masterUrl string, kubeconfigPath str…...

使用base64通用文件上传

编写一个上传文件的组件 tuku,点击图片上传后使用FileReader异步读取文件的内容&#xff0c;读取完成后获得文件名和base64码&#xff0c;调用后端uploadApi,传入姓名和base64文件信息&#xff0c;后端存入nginx中&#xff0c;用于访问 tuku.ts组件代码&#xff1a; <templa…...

Python深度学习

python深度学习&#xff0c;python代码定制&#xff0c; 可做创新点 创新思路 代码改进跑通 深度学习 Python代跑时间序列预测 分析 代码编写 python编程 深度学习算法 自然语言处理 神经网络跑通指导 爬虫调试代做 项目指导 定制帮做 改进 提升 创新 优化 Python Matlab C…...

django报错(三):No crontab program或got an unexpected keyword argument ‘user’

Crontab是linux系统上的定时管理模块&#xff0c;简单配置&#xff0c;灵活使用。但是要在windows使用必须借助Cygwin等虚拟工具&#xff0c;否则会报错“No crontab program”。如下图&#xff1a; python-crontab是其提供了python模块对crontab的访问&#xff0c;即可以通过p…...

数据库(创建数据库和表)

目录 一&#xff1a;创建数据库 二&#xff1a;创建表 2.1&#xff1a;创建employees表 2.2&#xff1a;创建orders表 2.3&#xff1a;创建invoices表 一&#xff1a;创建数据库 mysql> create database mydb6_product; Query OK, 1 row affected (0.01 sec) mysql&g…...

Log4j的原理及应用详解(一)

本系列文章简介&#xff1a; 在软件开发的广阔领域中&#xff0c;日志记录是一项至关重要的活动。它不仅帮助开发者追踪程序的执行流程&#xff0c;还在问题排查、性能监控以及用户行为分析等方面发挥着不可替代的作用。随着软件系统的日益复杂&#xff0c;对日志管理的需求也日…...

ubuntu系统Docker常用命令

1.查看docker是否开机启动 sudo systemctl list-unit-files | grep enable|grep docker 2.设置开机启动 sudo systemctl enable docker 3.关闭docker开机启动 sudo systemctl disable docker 4.开启docker服务 sudo service docker start 5.关闭docker服务 sudo servi…...

韦东山嵌入式linux系列-驱动设计的思想(面向对象/分层/分离)

1 面向对象 字符设备驱动程序抽象出一个 file_operations 结构体&#xff1b; 我们写的程序针对硬件部分抽象出 led_operations 结构体。 2 分层 上下分层&#xff0c;比如我们前面写的 LED 驱动程序就分为 2 层&#xff1a; ① 上层实现硬件无关的操作&#xff0c;比如注册…...

0/1背包

0/1背包 背包问题是DP最经典的类型之一&#xff0c;而0/1背包是最经典最基础的背包问题。 背包体积为 V V V&#xff0c; n n n种物品&#xff0c;每种物品只有1个&#xff0c;第 i i i种物品对应体积为 c i c_i ci​&#xff0c;价值为 w i w_i wi​&#xff0c;怎样装填能使…...