【运维】第03讲(上):Nginx 负载均衡常见架构及问题解析

news2024/11/24 5:35:44

实际上 Nginx 除了承担代理网关角色外还会应用于 7 层应用上的负载均衡,本课时重点讲解 Nginx 的负载均衡应用架构,及最常见的问题。

学前提示

Nginx 作为负载均衡是基于代理模式的基础之上,所以在学习本课时前,你需要对 Nginx 的代理、负载均衡的基本原理及 Nginx 负载均衡配置有基础的了解。有了这个基础以后,学习本课时的内容便会得心应手。

章节思维导图

这里我先画了一张思维导图,我们来一起看下本课计划讲解哪些内容。

在这里插入图片描述

首先会来讲一讲 Nginx 作为负载均衡在整体服务架构和网站服务架构里所扮演的角色,其次重点介绍 Nginx 作为负载均衡时遇到的一些常见问题,比如客户端 IP 地址获取问题、域名携带问题 等等。

Nginx 负载均衡应用架构

关于 Nginx 负载均衡应用架构在企业应用中主要有两种类型。

分层入口代理架构

在这里插入图片描述

第一类是分层入口代理架构(属于相对传统架构),我们可以对整个后台网站服务系统架构做一个分层。大体可以分为用户请求入口层,以及为用户请求提供逻辑处理的服务层和为用户提供真正相关数据的数据层。

如图所示,我们可以发现入口层是最接近用户请求的,所以在这一层中,Nginx 扮演着重要的角色——入口网关,并承担 7 层负载均衡(LB)的功能。如图所示入口层的 Nginx 之前还有一套 LB,LB 层的主要功能是为了 保证 Nginx 本身的高可用、或承担 TCP/IP 负载均衡功能,所以这里整个入口层的负载均衡模式是一个 4 层 LB+7 层 LB(Nginx),这套架构中把与业务服务的相关功能则由 Nginx 来处理。

哪一些业务服务相关功能交给 Nginx 作合适呢?比如在入口层我们会放一些和用户相关的信息,也比如之前讲过的动静分离(及实现分离网站页面的静态元素和动态元素) ,我们知道静态元素没有必要下沉到数据层获取,可以直接通过 Nginx 实现动态和静态的分流并由 Nginx 直接处理。另外,用户的访问控制、反爬虫等规则也是在入口层的 Nginx 实现的。

服务层同样也需要 Nginx , 来负载均衡实现上层请求应答上的高可用。

分层架构的最后一层是数据层,数据层中 Nginx 同样可以实现负载均衡,但数据层中通常使用的 Nginx 较少见,为什么呢?因为这一层更追求数据调用的效率,比如 Memcache、MySQL 等数据库调用更多是基于底层的协议请求,而非更上层的 HTTP 请求。

但如果如果追求 HTTP 的可靠性、和应用性,是可以借助 Nginx 的负载均衡实现的,如:可Redis 使用 Nginx 做反向代理,通过 Nginx 把前端发送的 HTTP 请求转换成 Redis 协议的请求方式去请求 Redis,这样就完成了 Redis 的反向代理。这种方式,企业可以很好控制Redis的监控、数据的一致性保障、及基于 Hash 算法稳定性保障。

总结 一下,Nginx 在分层架构里扮演了一个 7 层应用层负载均衡角色。随着软件架构和系统架构是不断演进变化,我们发现企业开始采用 K8s、Docker 这种轻量化、虚拟化部署;还有很多企业更加倾向于微服务架构,支持 set 化等。在这样的架构下,传统的分层负载均衡模式,促使改进去支持服务注册和发现。这个就是Jeson想介绍的第二种Nginx负载均衡模式。

服务注册发现代理架构

在这里插入图片描述

如图所示,图中重点列出了 Nginx 在注册发现场景中扮演的角色。同样,我们可以看到整个流量还是通过 Nginx 来做入口网关的,但是重要的一点是 Nginx 需要支持动态的发现和注册后端服务。

注册是指后端的应用程序(如图中的 App1~App4)需要去往前端的中心存储节点里面注册它的应用服务,当注册上报后,Nginx 动态发现并动态生成发现的配置,然后对入口网关代理负载均衡进行分流调整,我们可以发现在基于 K8s 和 Docker 这种部署模式业务入口网关就应用了这种架构。

两种负载均衡应用架构就讲完了,我们会发现两种架构最大的区别是后面一种支持后端服务的注册与发现。

接下来我们回顾下 Nginx 负载均衡配置。

常用配置

首先,我们先回顾Nginx基础负载均衡配置。

http {
        …
        upstream app_servers {
                 server ip1:port1;
                 server ip2:port2;
                 server ip3:port3;
        }
        server {
         …
              location / {
                      proxy_pass http://app_servers; 
              }
        ….
        }
}

在这里,将通过 Upstream 配置分发入口请求流量到了后台三个 IP 节点对应的端口服务。

这是一种常见的 Nginx 负载均衡配置,但是这样配置在实际企业应用时会发生一些问题,我们接下来就来讲解如何解决 Nginx 做负载均衡时的常见问题。

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

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

相关文章

Codeforces Round 884 (Div. 1 + Div. 2)(视频讲解A--D)

[TOC](Codeforces Round 884 (Div. 1 Div. 2)&#xff08;视频讲解A–D&#xff09;) 视频链接&#xff1a;Codeforces Round 884 (Div. 1 Div. 2)&#xff08;视频讲解A–D&#xff09; A Subtraction Game 1、 板书&#xff1a; 2、代码 #include<bits/stdc.h> #…

网络协议与攻击模拟-19-FTP协议

FTP 协议 1、了解 FTP 协议 2、使用在 Windows 操作系统上使用 serv - U 软件搭建 FTP 服务器 3、分析 FTP 流量 一、 FTP 协议 1、概念 FTP &#xff08;文件传输协议&#xff09;&#xff0c;由两部分组成&#xff1a;客户端&#xff0f;服务器 C / S 架构&#xff0c;应…

Uniapp 版本更新

文章目录 前言Uniapp更新确定接口是否能够使用基本代码封装更新软件区别 前言 软件发布之后更新是经常出现的需求。我们希望软件能够自动连网更新软件&#xff0c;而不是重新去手动安装一个apk安装包。不需要更新的软件只有两个&#xff0c;一个是微信小程序&#xff0c;另一个…

C++浅谈const

在学C的时候&#xff0c;必不可少的是const&#xff0c;他或许在C语言中是可有可无的&#xff0c;但是在C中绝对不是&#xff0c;我们在学习C语言的时候&#xff0c;我们知道的是&#xff0c;经常有人说加const是为了保证“安全”&#xff0c;那么&#xff0c;所谓的“安全”是…

MFC第十六天 CFileDialog、CEdit简介、(线程)进程的启动,以及Notepad的开发(托盘技术-->菜单功能)

文章目录 CCommonDialogCFileDialogCEdit托盘技术进程的启动附录1:启动线程方式附录2:MFC对话框的退出过程 CCommonDialog 通用对话框 CCommonDialog 这些对话框类封装 Windows 公共对话框。 它们提供了易于使用的复杂对话框实现。 CFileDialog 提供用于打开或保存文件的标准对…

使用Git上传大文件模型(超过100MB)教程

目录 modelscope官方教程 服务器拒绝的解决方案 检查.gitattributes文件 modelscope官方教程 我们

Amazon 上的数字孪生:使用 L3 预测性数字孪生来预测“行为”

在上一篇博文中&#xff0c;我们讨论了数字孪生的定义和框架&#xff0c;这与我们的客户在其应用中使用数字孪生的方式一致。我们将数字孪生定义为“单个物理系统的动态数字表示&#xff0c;它通过数据进行动态更新以模仿物理系统的真实结构、状态和行为&#xff0c;从而加快获…

Vue3+ts;枚举(enum);Partial全部可选/Pick选一部分/配置 svg 图标/unplugin-vue-components组件自动按需加载

项目的创建 使用 create-vue 脚手架创建项目。 1.执行创建命令 pnpm create vue # or npm init vuelatest # or yarn create vue2.选择项目依赖内容。 ✔ Project name: … //项目名 ✔ Add TypeScript? … No / Yes ✔ Add JSX Support? … No / Yes ✔ Add Vue Router …

macOS 开发 - 纯代码生成 Window

文章目录 1、创建项目删除项目自带 window创建 BaseWindowController 继承自 NSWindowController子 WC 继承 BaseWC个人更喜欢纯代码:控制力、方便复制,不用卡卡的打开 xib 这里不使用各种项目自带的 storyboard/xib,使用纯代码创建 window(controller) 本示例代码将创建如下…

记录一下Mybatis中的if标签使用时遇到的问题

记录一下Mybatis中的if标签使用时遇到的问题 前言一、if标签遇到的问题二、if标签中""和的问题字符串等于条件的两种写法&#xff1a; 三 、总结 前言 今天在项目中进行查询时使用了if标签&#xff0c;遇到了问题&#xff1a; 开始时拉过代码来的时候是这样的 <…

Java关键字interface(接口)

文章目录 接口的理解接口的声明接口的成员说明接口的使用规则类实现接口&#xff08;implements&#xff09; 接口的多实现接口的多继承(extends)接口与实现类对象构成多态引用使用接口的静态成员使用接口的非静态方法JDK8中相关冲突问题总结小测试接口与抽象类之间的对比练习 …

不允许你不知道的 MySQL 优化实战(二)

文章目录 11、使用联合索引时&#xff0c;注意索引列的顺序&#xff0c;一般遵循最左匹配原则。12、对查询进行优化&#xff0c;应考虑在where及order by涉及的列上建立索引&#xff0c;尽量避免全表扫描。13、如果插入数据过多&#xff0c;考虑批量插入。14、在适当的时候&…

[QT编程系列-9]:C++图形用户界面编程,QT框架快速入门培训 - 3- QT窗体设计 - 自动布局

目录 3. QT窗体设计 3.7 自动布局 3.7.1 自动布局 3.7.2 在主窗口中自动布局 3.7.3 在自动布局容器中自动布局 3.7.4 在widget中自动布局 3.7.5 自动布局工件 3. QT窗体设计 3.7 自动布局 3.7.1 自动布局 在QT中&#xff0c;自动布局是一种灵活而强大的方式来管理和排…

【ArcGIS Pro二次开发】(47):要素类追加至空库(批量)

本工具主要是针对国空数据入库而做的。 如果你手头已经整理了一部分要素类数据&#xff0c;但是数据格式&#xff0c;字段值可能并没有完全按照规范设置好&#xff0c;需要将这些数据按规范批量和库&#xff0c;就可以尝试用这个工具。 准备数据&#xff1a;标准空库、你已做…

Vue源码分析拓展 - Vue 模板编译渲染函数原理分析

目录 Vue 模板编译渲染函数 编译 Vue 模板编译渲染函数原理分析.html compiletoFunctions.html compileToFunctions.js vue.2.5.1.源码学习.js 一张AI生成图~ Vue 模板编译渲染函数 new Vue():初始化 $mount:挂载 compile():编译 parse:解析 optimize&#xff1a;静态节…

身份证读卡器安卓SDK在安卓12版本targetSdkVersion=32报错解决办法

之前的东信智能的EST-100身份证读卡器安卓SDK版本V1.0.40在安卓12版本&#xff0c;targetSdkVersion32的时候会出现以下错误&#xff1a; Targeting S (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingInten…

Nginx 解决漏洞扫描 弱CORS策略

主要在nginx配置允许通过的地址 如&#xff1a; if ($http_host !~* 192.168.0.1|127.0.0.1|localhost) { # 允许的ipreturn 403 ; }add_header Access-Control-Allow-Origin $http_origin; #跨域请求

高压放大器到底有什么作用

高压放大器是一种重要的电子元器件&#xff0c;其作用是将信号放大到更高的电压水平&#xff0c;以便供给需要高电压的负载使用。高压放大器被广泛应用于通讯设备、医疗仪器、仿真模拟、气体激光、光学器件等领域。下面安泰电子将详细介绍高压放大器的作用以及其在各领域中的应…

Win11 设置FTP服务详细教程

起因&#xff1a; 因测试需要&#xff0c;本机建立FTP服务测试使用&#xff0c;此文章用于记录使用&#xff01; 操作步骤&#xff1a; 1、配置FTP功能 ①、"winR" > 在运行窗口输入"control" 回车&#xff1b; ②、打开"控制面板" > 点击…

图文讲解Redis延时双删原因及必要性

目录 一、前言 二、常见更新策略 2.1 先删缓存&#xff0c;再更新数据库 2.2 先更新数据库&#xff0c;再删除缓存 2.3 普通双删 2.4 延迟双删 三、建议 一、前言 我们在实际项目中经常会使用到Redis缓存用来缓解数据库压力&#xff0c;但是当更新数据库时&#xff0c;…