Nginx 平滑升级原理分析和实验

Nginx平滑升级

  • 1. 为什么要对 Nginx 平滑升级
  • 2. 平滑升级的原理
  • 3. Nginx 信号简介
    • 3.1. master 主进程支持的信号
    • 3.2. worker 工作进程支持的信号
  • 4. Nginx 平滑升级实战
  • 5. 平滑升级总结
  • 6. 升级实验
    • 6.1. 部署一台新的 Nginx 服务器
    • 6.2. 查看版本和模块
    • 6.3. 访问验证
    • 6.4. 升级 Nginx

1. 为什么要对 Nginx 平滑升级

对Nginx进行平滑升级是为了确保服务在升级过程中不中断,保持稳定性和可用性。平滑升级的主要目的是在不影响用户访问的情况下,应用新的配置或版本,以及引入新的功能或修复安全漏洞。以下是一些理由:

  1. 无中断升级: 平滑升级可以确保在整个升级过程中不中断正在处理的请求。这对于需要提供高可用性和无缝用户体验的服务来说至关重要。
  2. 持续服务: 在升级期间,Nginx可以继续处理来自用户的请求,而不需要暂停或重启整个服务。这对于在线业务和关键应用来说是至关重要的,可以保持服务的连续性。
  3. 避免用户感知: 平滑升级可以在后台进行,对用户来说是透明的。用户不会察觉到系统正在进行升级,他们可以继续正常使用服务而不受影响。
  4. 配置无缝切换: 平滑升级允许管理员在新旧配置之间平稳过渡,确保新的配置在启用后立即生效,而不会导致服务中断。
  5. 防止请求丢失: 平滑升级通常会确保在升级过程中,已接受的请求能够被顺利完成,而不会丢失。这对于保障数据完整性和一致性非常重要。
  6. 应用新特性: 平滑升级使得可以引入新的功能或性能优化,而不会对现有服务造成负面影响。这有助于及时应用最新的技术和改进。

在实施平滑升级时,通常采用以下策略:

  • 多实例部署: 启动一个新的Nginx实例,并在新实例上进行升级测试,然后切换流量到新实例,最后停止旧实例。
  • 热重载: 使用Nginx的热重载功能,通过向主进程发送信号,实现不停止服务的情况下加载新的配置。
  • 蓝绿部署: 将新版本的Nginx部署在与旧版本相同的环境中,然后逐渐将流量从旧版本切换到新版本。

无论采用哪种策略,平滑升级都是一种最佳实践,可以确保服务的稳定性和可用性。

2. 平滑升级的原理

平滑升级的原理主要涉及到在升级过程中保持服务的连续性和稳定性。以下是平滑升级的一般原理:

  1. 多实例部署:
  • 在平滑升级中,通常会采用多实例部署的方式。新版本的 Nginx 会在一个独立的实例中启动,并与旧版本的 Nginx 并行运行。
  1. 新旧版本并行:
  • 新旧版本的 Nginx 实例会并行处理请求。这样做的目的是确保在升级过程中不中断服务,同时逐步将流量从旧版本切换到新版本。
  1. 流量切换:
  • 管理员可以逐步切换流量,将一部分请求导向新版本的 Nginx 实例。这可以通过负载均衡器、代理服务器或 DNS 修改来实现。流量逐渐过渡,直到完全切换到新版本。
  1. 配置逐步生效:
  • 新版本的 Nginx 会加载新的配置,但并不一定立即生效。管理员可以逐步应用新的配置,确保在升级过程中不会导致配置的突然变更,从而影响服务的稳定性。
  1. 请求完成:
  • 在升级过程中,已经接收的请求会继续由旧版本的 Nginx 处理,而新版本则处理新的请求。这确保了已接受的请求能够顺利完成,而不会丢失。
  1. 检测和监控:
  • 在整个升级过程中,管理员需要进行实时的监控和检测。这包括监控新旧版本的性能、错误率、日志等,以确保升级过程中没有出现异常情况。
  1. 回滚机制:
  • 如果在升级过程中发现了问题,管理员可以快速回滚到旧版本,恢复正常服务。因此,平滑升级需要提供有效的回滚机制,确保在出现意外情况时能够及时处理。
  1. 灰度发布:
  • 平滑升级的一种变体是灰度发布,其中只向部分用户或流量引入新版本。这有助于在小范围内测试新版本,发现潜在问题并及时修复。

其原理简单概括,就是:
(1)在不停掉老进程的情况下,启动新进程。
(2)老进程负责处理仍然没有处理完的请求,但不再接受处理请求。
(3)新进程接受新请求。
(4)老进程处理完所有请求,关闭所有连接后,停止。
这样就很方便地实现了平滑升级。一般有两种情况下需要升级 Nginx,一种是确实要升级 Nginx 的版本,另一种是要为 Nginx 添加新的模块
平滑升级是热升级、热部署,可以不停服务的情况对 Nginx 服务进行升级

3. Nginx 信号简介

3.1. master 主进程支持的信号

  • TERM, INT:立刻退出
  • QUIT:等待工作进程结束后再退出
  • KILL:强制终止进程
  • HUP:重新加载配置文件,使用新的配置启动工作进程,并逐步关闭旧进程。
  • USR1:重新打开日志文件
  • USR2:启动新的主进程master,实现热升级
  • WINCH:逐步关闭worker工作进程

3.2. worker 工作进程支持的信号

  • TERM, INT:立刻退出
  • QUIT:等待请求处理结束后再退出
  • USR1:重新打开日志文件

4. Nginx 平滑升级实战

将nginx1.16升级成nginx1.18
wget https://nginx.org/download/nginx-1.16.0.tar.gz
yum -y install gcc gcc-c++ pcre pcre-devel gd-devel openssl openssl-devel  zlib zlib-devel
useradd nginx && echo "nginx" | passwd --stdin nginx
mkdir /tmp/nginx
tar -xzvf nginx-1.16.0.tar.gz -C /usr/local/
cd /usr/local/nginx*./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--with-http_ssl_module \make && make install#将nginx托管到systemd管理(可选步骤)
vim  /usr/lib/systemd/system/nginx.service 
[Unit]
#描述服务
Description=nginx
#描述服务类别
After=network.target#服务运行参数的设置,注意【Service】的启动、重启、停止命令都要用绝对路径
[Service]
#后台运行的形式
Type=forking
#服务具体运行的命令
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#重启命令
ExecReload=/usr/local/nginx/sbin/nginx -s reload
#停止命令
ExecStop=/usr/local/nginx/sbin/nginx -s  stop 
#表示给服务分配独立的临时空间
PrivateTmp=true#运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
[Install]
WantedBy=multi-user.targetsystemctl daemon-reload
systemctl enable --now nginx
systemctl status nginx

查看现有的 nginx 编译参数

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

按照原来的编译参数安装 nginx 的方法进行安装
只需要到 make,千万不要 make install 。如果 make install 会将原来的配置文件覆盖

#下载nginx1.18版本
wget https://nginx.org/download/nginx-1.18.0.tar.gztar -xzvf nginx-1.18.0.tar.gz -C /usr/local/cd /usr/local/nginx-1.18.0/./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--with-http_ssl_module \make

备份原 nginx 二进制文件
备份二进制文件和 nginx 的配置文件(期间nginx不会停止服务)

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_$(date +%F)

复制新的nginx二进制文件,进入新的nginx源码包

cp /usr/local/nginx-1.16.0/objs/nginx /usr/local/nginx/sbin/

测试新版本的nginx是否正常

/usr/local/nginx/sbin/nginx -t

给nginx发送平滑迁移信号(若不清楚pid路径,请查看nginx配置文件)

kill -USR2 `cat /var/run/nginx.pid`

查看nginx pid,会出现一个nginx.pid.oldbin

ll /var/run/nginx.pid*
-rw-r--r-- 1 root root 5 Jul  1 11:29 /var/run/nginx.pid
-rw-r--r-- 1 root root 5 Jul  1 09:54 /var/run/nginx.pid.oldbin

从容/优雅的关闭旧的Nginx进程

kill -WINCH `cat /var/run/nginx.pid.oldbin`

结束工作进程,完成此次升级

kill -QUIT `cat /var/run/nginx.pid.oldbin`

验证Nginx是否升级成功

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

5. 平滑升级总结

实现的步骤:
1、首先使用nginx -V查看nginx现有的编译参数
2、然后下载好要更新的源码包,上传到服务器中,然后使用make命令编译,编译时用--with添加要使用的模快,--without去除不需要的模快
3、备份旧的nginx二进制文件,再将新编译好的二进制文件复制到/usr/local/nginx/sbin
4、备份完之后,给旧的进程发送一个kill -USR2的信号,会启动一个新的nginx主进程,实现热升级
5、然后这个时候就能发现/var/run/nginx/pid下会出现两个进程(nginx.pidnginx.pid.oldbin
6、再给旧的nginx进程发送一个kill -WINCH的信号,让旧的nginx work进程从容关闭,不再接受新请求
7、然后发送一个kill -QUIT的信号,让旧的nginx主进程处理完请求后再退出
8、最后再查看nginx的版本,是否升级成功

6. 升级实验

6.1. 部署一台新的 Nginx 服务器

安装配置1.6版本的 nginx,重新开启一台机器

[root@localhost ~]# yum install -y gcc gcc-c++ pcre-devel openssl-devel zlib-devel
[root@localhost ~]# tar xzf nginx-1.6.3.tar.gz -C /usr/local/
[root@localhost ~]# cd /usr/local/nginx-1.6.3
[root@localhost nginx-1.6.3]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@localhost nginx-1.6.3]# make && make install
[root@localhost nginx-1.6.3]# useradd -M -s /sbin/nologin nginx
[root@localhost nginx-1.6.3]# /usr/local/nginx/sbin/nginx -t 
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost nginx-1.6.3]# /usr/local/nginx/sbin/nginx 
[root@localhost nginx-1.6.3]# netstat -lntp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      13989/nginx: master

6.2. 查看版本和模块

[root@localhost nginx-1.6.3]# /usr/local/nginx/sbin/nginx -V 
nginx version: nginx/1.6.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@localhost nginx-1.6.3]# echo "nginx1.6" > /usr/local/nginx/html/index.html
[root@localhost nginx-1.6.3]# yum install -y elinks

6.3. 访问验证

[root@localhost nginx-1.6.3]# elinks -dump 192.168.221.138

6.4. 升级 Nginx

将 nginx 版本进行升级 并在不影响业务的情况下添加 SSL 和 pcre 模块

[root@localhost ~]# tar xzf nginx-1.12.2.tar.gz -C /usr/local/
[root@localhost ~]# cd /usr/local/nginx-1.12.2/
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=ngiinx --with-http_stub_status_module --with-http_ssl_module --with-pcre
[root@localhost nginx-1.12.2]# make
[root@localhost nginx-1.12.2]# cd
[root@localhost ~]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_lod
[root@localhost ~]# cp /usr/local/nginx-1.12.2/objs/nginx /usr/local/nginx/sbin/
[root@localhost ~]# kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`

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

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

相关文章

autosar学习笔记 之SecOC

SecOC 接下来SecOC标准就更复杂一点,它不单单是做了通讯校验。 SecOC是基于对称密钥加密的一套机制,需要对ECU间的通讯作身份认证处理,来更好的防止伪装攻击,谈起对称或非对称加密,就会涉及到密钥的存储和Mac值的计算。 因此SECOC机制对于密钥的硬件存储,也有一定的要求…

matlab appdesigner系列-常用15-滑块、微调器

滑块,以左右拖动的方式在一定范围内改变数值 此示例,滑块显示微调器的数值,微调器也可以显示滑块的数值 操作步骤为: 1)将滑块和微调器拖拽到画布上 2)分别设置这两个组件的回调函数 回调函数有两个选项…

c语言-常见的动态内存错误

文章目录 前言一、常见的动态内存错误1.1 对空指针进行解引用操作1.2 对动态开辟的空间进行越界访问1.3 对非动态开辟的空间使用free()1.4 使用free()释放一块动态开辟的空间时,释放不完全1.5 对同一块动态开辟的空间进行多次释放1.6 动态开辟的空间使用后&#xff…

Android14源码剖析:MediaPlayer与MediaPlayerService区别?(五十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

CRM系统环境搭建部署(nginx、jdk、tomcat、keepalived、mysql、zabbix)

CRM系统环境搭建部署(nginx、jdk、tomcat、keepalived、mysql、zabbix) crm.XXX.com #CRM系统使用的域名,已注册并做好DNS解析 两台应用服务器(主、备):172.16.38.172、172.16.38.173 两台数据库服务器…

MySQL数据库 | 事务中的一些问题(重点)

文章目录 什么是事务?事务的几个特性(ACID) -重点原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability) Mysql中事务操作隐式事务显式事务 savepoint关键字只读事务事务中的一些问题(重点)隔离级别脏读解决办法 幻读解决…

美易官方《惊爆财务丑闻,有空头已经赚了十倍》

惊爆财务丑闻,“四大粮商”之首ADM股价暴跌,有空头已经赚了十倍 近日,一起惊爆市场的财务丑闻让全球投资者为之震惊。作为全球最大的农业综合企业之一,“四大粮商”之首的ADM(Archer Daniels Midland)被曝涉…

信息检索与数据挖掘 | (八)语言建模的IR

文章目录 📚语言生成模型📚平滑🐇线性插值平滑方法(Lelinek-Mercer)🐇dirichlet 平滑🐇Vector space(向量空间) vs BM25 vs LM 📚语言生成模型 传统的语言生成模型可以用于识别或生成…

【Pytorch】搭建一个简单的泰坦尼克号预测模型

介绍 本文使用PyTorch构建一个简单而有效的泰坦尼克号生存预测模型。通过这个项目,你会学到如何使用PyTorch框架创建神经网络、进行数据预处理和训练模型。我们将探讨如何处理泰坦尼克号数据集,设计并训练一个神经网络,以预测乘客是否在灾难…

MySQL数据库查询语句之组函数,子查询语句

组函数 以组为操作单位,一组数据得到一个结果。 在没有手动分组的前提下,整张表默认为一组数据 max(列名):获取最大值 min(列名):获取最小值 sum(列名):获取总和 avg(列名):获取平均值 count(列名)&a…

20.云原生之GitLab CICD实战

云原生专栏大纲 文章目录 GitLab RunnerGitLab Runner 介绍Gitlab Runner工作流程 Gitlab集成Gitlab RunnerGitLab Runner 版本选择Gitlab Runner部署docker-compose方式安装kubesphere中可视化方式安装helm方式安装 配置gitlab-runner配置gitlab-ci.ymlgitlab-ci.yml 介绍编写…

基于FPGA的高效乘法器

1、设计思路 二进制的乘法运算与十进制的乘法运算相似,如下图所示,二进制数据6’b110010乘以二进制数据4’b1011,得到乘积结果10’b1000100110。 图1 二进制乘法运算 仔细观察上图发现,乘数最低位为1(上图紫色数据位&a…

机器学习:什么是监督学习和无监督学习

目录 一、监督学习 (一)回归 (二)分类 二、无监督学习 聚类 一、监督学习 介绍:监督学习是指学习输入到输出(x->y)映射的机器学习算法,监督即理解为:已知正确答案…

Eureka基础知识总结(微服务)

Eureka Eureka是Netflix开发的一个服务发现框架,它提供了一种在微服务架构中注册和发现服务的方法。通过使用Eureka,我们可以实现负载均衡、故障转移和服务的自动注册等功能。本文将对Eureka的相关知识进行总结。 一、Eureka的基本概念 Eureka Server…

Arduino开发实例-LoRa通信(基于SX1278 LoRa)

LoRa通信(基于SX1278 LoRa) 文章目录 LoRa通信(基于SX1278 LoRa)1、硬件准备1.1 Semtech LoRa SX1278 收发器2、LoRa介绍2.1 什么是LoRa2.2 SX1278 LoRa 模块2.1 LoRa 频段(按国家/地区划分)3、硬件接线原理图4、代码实现4.1 数据发送与接收4.2 远距离控制LED实现4.2.1 硬…

leetcode-二叉树的前序遍历

144. 二叉树的前序遍历 递归方法 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def preorderTraversal(…

期末考试发等级发成绩,就用易查分!

期末考试后,学校老师如何发布私密成绩?易查分可以轻松创建等级、成绩查询系统,让家长仅看到自己孩子成绩。 支持查询后留言反馈,电子签名确认签收等高级功能,节省老师沟通时间,大大提升工作效率。 &#x1…

linux安装docker(入门一)

环境:centos 7(linux) 网站 官网: https://docs.docker.com/ Docker Hub 网站: https://hub.docker.com/ 容器官方概述 一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立软件包 &…

蓝桥杯分糖果、最小化战斗力差距、小蓝零花钱

分糖果 问题描述 最近暑期特训算法班的同学们表现出色,他们的老师肖恩决定给他们分发糖果。肖恩购买了 个不同种类的糖果,用小写的阿拉伯字母表示。每个糖果必须分发给一个同学,并且每个同学至少要分到一个糖果。同学们的开心程度定义为他们所…

【百面机器学习】读书笔记(一)

本文系列主要作用就是读书笔记,自己看的话比较杂,没怎么归类过,所以现在跟着这个分类走一遍。本文主要内容为前两章,特征工程和模型评估。 如果我想起一些相关的内容也会做适当的补充,主打就是一个intuition&#xff…