架构师之路-学渣到学霸历程-38

nginx的热部署(方案二)

方案一的缺点就是直接升级完成了;

那么问题来了:

  • 如果说出现问题了,想要回退 那么应该怎么处理?
  • 所以最好就是有一段的缓冲期限;

那么久可以直接 从升级的方案来进行 拆分

1、查看原来的编译参数
#这个是一样的;可以优先查看编译参数
[root@Linux2 ~]# nginx -V
nginx version: LJW/WEB
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
configure arguments: --prefix=/usr/local/nginx
  • 这里只是指定了一个编译参数,其余都是默认的;
  • 那么我们现在尝试多增加一个编译参数
2、准备nginx的源码包
#准备好源码包:#上面的是nginx的 1.27版本,目前这个是1.26版本
[root@Linux2 ~]# cd nginx-1.26.2
3、预编译、编译、安装
#预编译 -->这里再加一个status的状态模块
[root@Linux2 nginx-1.26.2]# ./configure  --prefix=/usr/local/nginx --with-http_stub_status_module#编译、安装
[root@Linux2 nginx-1.26.2]# make && make install
4、生成新的master进程
  • 首先:查看原来的nginx的pid
    • 给它发信号,
#升级的过程是把make upgrade的步骤拆开
[root@Linux2 nginx-1.26.2]# tail -10 Makefile 
upgrade:/usr/local/nginx/sbin/nginx -t				#测试一下配置文件kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`	#然后发送信号给pidsleep 1test -f /usr/local/nginx/logs/nginx.pid.oldbin		#然后备份一个pid文件kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`	#然后退出老的进程.PHONY:	build install modules upgrade#优先查看一下pid号#这里可以蛋刀master的进程号是9359
[root@Linux2 nginx-1.26.2]# ps -ef | grep nginx
root       9359      1  0 11:44 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/ngin
nobody     9361   9359  0 11:44 ?        00:00:00 nginx: worker process
root      12052   1157  0 12:11 pts/0    00:00:00 grep --color=auto nginx#然后给到这个进程发送一个信号
[root@Linux2 nginx-1.26.2]# kill -USR2 9359#这里明显看到多了一个master进程#多出来的master进程号是12053
[root@Linux2 nginx-1.26.2]# ps -ef | grep nginx
root       9359      1  0 11:44 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/ngin
nobody     9361   9359  0 11:44 ?        00:00:00 nginx: worker process
root      12053   9359  0 12:12 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/ngin
nobody    12054  12053  0 12:12 ?        00:00:00 nginx: worker process
root      12056   1157  0 12:12 pts/0    00:00:00 grep --color=auto nginx
5、退出老master进程
  • 接上述实验,老的master进程号是9359
#向老的master进程发信号:
[root@Linux2 nginx-1.26.2]# kill -WINCH 9359
[root@Linux2 nginx-1.26.2]# ps -ef | grep "[n]ginx"
root       9359      1  0 11:44 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/ngin
root      12053   9359  0 12:12 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/ngin
nobody    12054  12053  0 12:12 ?        00:00:00 nginx: worker process
  • 这时候,检查一下nginx的版本是否回退了
    • 这里需要注意、老进程并没有退出的,
    • 只是测试一段时间没问题才推出
#到这里为止,我们能够看到版本号已经回到1.26版本了
[root@Linux2 nginx-1.26.2]# nginx -V
nginx version: nginx/1.26.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module
6、抉择

这里的抉择指的是:

  • 可以回退到原来1.27版本
  • 也可以直接回到目前的1.26版本
#这里回滚#重新拉起老的worker进程:
[root@Linux2 nginx-1.26.2]# kill -HUP 9359#再次查看:没有问题
[root@Linux2 nginx-1.26.2]# ps -ef | grep "[n]ginx"
root       9359      1  0 11:44 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/ngin
root      12053   9359  0 12:12 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/ngin
nobody    12054  12053  0 12:12 ?        00:00:00 nginx: worker process
nobody    12063   9359  0 12:20 ?        00:00:00 nginx: worker process#回滚就得退出目前的新的nginx的master号
[root@Linux2 nginx-1.26.2]# kill -QUIT 12053
[root@Linux2 nginx-1.26.2]# ps -ef | grep "[n]ginx"
root       9359      1  0 11:44 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/ngin
nobody    12063   9359  0 12:20 ?        00:00:00 nginx: worker process#然后把升级的旧文件,重新换回来
[root@Linux2 nginx-1.26.2]# mv /usr/local/nginx/sbin/nginx.old  /usr/local/nginx/sbin/nginx

如果是决定使用了nginx的最新版本

  • nginx的最新版本
#直接退出老worker的进程即可
[root@Linux2 nginx-1.26.2]# kill -QUIT 9359
[root@Linux2 nginx-1.26.2]# ps -ef | grep "[n]ginx"
root      12073      1  0 12:24 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/ngin
nobody    12074  12073  0 12:24 ?        00:00:00 nginx: worker process

分享环节:

hi,亲爱的朋友们:

  • 感谢你们耐心完这个笔记,如果笔记中出现的一些软件包、资源找不到的可以直接留言&私聊,我看见了就回复;
  • 资源免费共享;有需要滴滴,(仅仅是我有的)

我的坚持初衷:💕立志要成为一名架构师

  • 不断地去坚持学,其中的各种各样的难度,不言而喻~!
  • 坚持不是一件容易的事情,但它却是成功的关键。做起来吧~!

如果你也想要坚持:那么组团吧,咋们一块互相监督;一天一点分享也是进步;最怕就是孤军奋战!加油吧,追梦人~!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP-HaloPanel:用 ESP32-C2 打造超低成本智能家居面板

项目简介 在生活品质日益提升的今天,智能家居系统已经走进了千家万户,并逐渐成为现代生活的一部份。与此同时,一款设计精致、体积轻盈、操作简便的全屋智能家居控制面板,已经成为众多家庭的新宠。这种高效、直观的智能化的解决方…

Hadoop生态圈框架部署(四)- Hadoop完全分布式部署

文章目录 前言一、Hadoop完全分布式部署(手动部署)1. 下载hadoop2. 上传安装包2. 解压hadoop安装包3. 配置hadoop配置文件3.1 虚拟机hadoop1修改hadoop配置文件3.1.1 修改 hadoop-env.sh 配置文件3.3.2 修改 core-site.xml 配置文件3.3.3 修改 hdfs-site…

数据建模圣经|数据模型资源手册卷3,数据建模最佳实践

简介 本书采用了类设计模式的方式对数据模型进行高度抽象总结,展现了常见的数据模型构建模型等模型的作用、层次、分类、地位、沟通方式,和业务规则。使用一个强大的数据模型模式的数据建模,评估特定与广义模型的优缺点,有助于你改…

【力扣】Go语言回溯算法详细实现与方法论提炼

文章目录 一、引言二、回溯算法的核心概念三、组合问题1. LeetCode 77. 组合2. LeetCode 216. 组合总和III3. LeetCode 17. 电话号码的字母组合4. LeetCode 39. 组合总和5. LeetCode 40. 组合总和 II小结 四、分割问题6. LeetCode 131. 分割回文串7. LeetCode 93. 复原IP地址小…

#渗透测试#SRC漏洞挖掘# 信息收集-Shodan进阶之Mongodb未授权访问

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

Golang--流程控制

1、分支结构 1.1 if分支 单分支 语法:if 条件表达式 { 逻辑代码 } 当条件表达式为true时,就会执行代码块的代码。条件表达式左右的()可以不写,也建议不写 if和表达式中间,一定要有空格在Golang中,{}是必须有的,就算你…

【补补漏洞吧 | 02】等保测评ZooKeeperElasticsearch未授权访问漏洞补漏方法

一、项目背景 客户新系统上线,因为行业网络安全要求,需要做等保测评, 通过第三方漏扫工具扫描系统,漏扫报告显示ZooKeeper和 Elasticsearch 服务各拥有一个漏洞,具体结果如下: 1、ZooKeeper 未授权访问【…

Serverless + AI 让应用开发更简单

本文整理自 2024 云栖大会,阿里云智能高级技术专家,史明伟演讲议题《Serverless AI 让应用开发更简单》 随着云计算和人工智能(AI)技术的飞速发展,企业对于高效、灵活且成本效益高的解决方案的需求日益增长。本文旨在…

从0开始学PHP面向对象内容之(类,对象,构造/析构函数)

上期我们讲了面向对象的一些基本信息&#xff0c;这期让我们详细的了解一下 一、面向对象—类 1、PHP类的定义语法&#xff1a; <?php class className {var $var1;var $var2 "constant string";function classfunc ($arg1, $arg2) {[..]}[..] } ?>2、解…

(八)JavaWeb后端开发——Tomcat

目录 1.Web服务器概念 2.tomcat 1.Web服务器概念 服务器&#xff1a;安装了服务器软件的计算机服务器软件&#xff1a;接收用户的请求&#xff0c;处理请求&#xff0c;做出响应web服务器软件&#xff1a;在web服务器软件中&#xff0c;可以部署web项目&#xff0c;让用户通…

【Linux系列】Linux 和 Unix 系统中的`set`命令与错误处理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Nuxt.js 应用中的 nitro:config 事件钩子详解

title: Nuxt.js 应用中的 nitro:config 事件钩子详解 date: 2024/11/2 updated: 2024/11/2 author: cmdragon excerpt: nitro:config 是 Nuxt 3 中的一个生命周期钩子,允许开发者在初始化 Nitro 之前自定义 Nitro 的配置。Nitro 是 Nuxt 3 的服务器引擎,负责处理请求、渲…

[论文阅读]LOGAN: Membership Inference Attacks Against Generative Models

LOGAN: Membership Inference Attacks Against Generative Models https://arxiv.org/abs/1705.07663v4 Proceedings on Privacy Enhancing Technologies &#xff08;PoPETs&#xff09;&#xff0c;第 2019 卷&#xff0c;第 1 期。 这篇文章是17年的一篇文章&#xff0c;…

使用Vite构建现代化前端应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Vite构建现代化前端应用 引言 Vite 简介 安装 Vite 创建项目 启动开发服务器 项目结构 配置 Vite 开发模式 生产构建 使用插…

Node.js:模块 包

Node.js&#xff1a;模块 & 包 模块module对象 包npm安装包配置文件镜像源 分类 模块 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 简单来说&#xff0c;就是把一个…

【Arduino】一分钟快速在vs code 编译开发Arduino

下载Arduino 对于一些开发者来说&#xff0c;Arduino开发较为不方便&#xff0c;不管从代码的阅读性、开发效率等等方面&#xff0c;vs code都要优于Arduino IDE开发&#xff0c;而且vs code开发可以使用插件&#xff0c;比如一些AI代码插件&#xff0c;可以加快开发速率&#…

WPF+MVVM案例实战(十九)- 自定义字体图标按钮的封装与实现(EF类)

文章目录 1、案例效果1、按钮分类2、E类按钮功能实现与封装1.文件创建与代码实现2、样式引用与封装 3、F类按钮功能实现与封装1、文件创建与代码实现2、样式引用与封装 3、按钮案例演示1、页面实现与文件创建2、运行效果如下 4、源代码获取 1、案例效果 1、按钮分类 在WPF开发…

Java基本语法和基础数据类型——针对实习面试

目录 Java基本语法和基础数据类型标识符和关键字有什么区别&#xff1f;Java关键字有哪些&#xff1f;Java基本数据类型有哪些&#xff1f;什么是自动装箱和拆箱&#xff1f;自动装箱&#xff08;Autoboxing&#xff09;自动拆箱&#xff08;Unboxing&#xff09; 自动装箱和拆…

c# 值类型

目录 1、c#类型2、值类型2.1 结构体2.2 枚举 1、c#类型 类型&#xff08;Type&#xff09;又叫数据类型&#xff08;Data Type&#xff09;。 A data type is a homogeneous collection of values,effectively prensented,equipped with a set of operations which manipulate…

【压力测试】如何确定系统最大并发用户数?

一、明确测试目的与了解需求 明确测试目的&#xff1a;首先需要明确测试的目的&#xff0c;即为什么要确定系统的最大并发用户数。这通常与业务需求、系统预期的最大用户负载以及系统的稳定性要求相关。 了解业务需求&#xff1a;深入了解系统的业务特性&#xff0c;包括用户行…