Nginx系列之 一 负载均衡

news2024/11/23 10:03:49

目录

一、Nginx概述

1.1 负载均衡概述

1.2 负载均衡的作用

1.3 四/七层负载均衡

1.3.1 网络模型简介

1.3.2 四层和七层负载均衡对比

1.3.3 Nginx七层负载均衡实现

1.4 Nginx负载均衡配置

1.5 Nginx负载均衡状态

1.6 Nginx负载均衡策略

二、负载均衡实战

2.1 测试服务器

2.2 普通轮询

2.2.1 实现效果

2.2.2 准备工作

2.2.3 实现

2.3 weight加权(加权轮询)

2.3.1 实现效果

2.3.2 准备工作

2.3.3 实现

2.4 ip_hash

2.5 url_hash

2.6 fair

三、阿里云传统型负载均衡CLB

3.1 概述

3.2CLB组成

3.3 产品优势

3.4 阿里云控制台配置SLB


Nginx系列之 一 入门安装_开着拖拉机回家的博客-CSDN博客

Nginx系列之 一 反向代理_开着拖拉机回家的博客-CSDN博客


一、Nginx概述


随着社会越来越快的发展,信息化和数字化建设蓬勃发展,用户访问服务的数量也随之骤增,依靠单设备硬件愈发不能满足高并发下的大量网络请求,因此负载均衡(LB)应用而生。

1.1 负载均衡概述


所谓负载均衡,就是 Nginx 把请求分摊给上游的应用服务器,这样即使某一个服务器宕机也不会影响请求的处理,或者当应用服务器扛不住了,可以随时进行扩容。

应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理并返回响应的数据。

负载均衡器: 将用户访问的请求根据对应的负载均衡算法,分发到集群中的一台服务器进行处理。

1.2 负载均衡的作用


1、解决服务器的高并发压力,提高应用程序的处理性能。

2、提供故障转移,实现服务高可用和可靠性。

3、通过增加或减少服务器数量,增强网站的可扩展性。

4、在负载均衡器上进行过滤,可以提高系统的安全性。

1.3 四/七层负载均衡


1.3.1 网络模型简介


OSI(Open System Interconnection,开放式系统互联模型)是由国际标准化组织ISO指定的一个不基于具体机型、操作系统或公司的网络体系结构。该模型将网络通信的工作分为七层。

负载均衡主要分为四层和七层负载均衡,对应osi七层模型的四层和七层

四层负载均衡工作在OSI模型的第四层-传输层,由于在传输层,只有TCP/UDP协议,这两种协议中除了包含源IP、目标IP以外,还包含源端口号及目的端口号。

四层负载均衡 服务器在接受到客户端请求后,以后通过修改数据包的地址信息(IP+端口号)将流量转发到应用服务器。

七层负载均衡工作在OSI模型的应用层,应用层协议较多,常用http、radius、dns等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个Web服务器的负载均衡,除了根据IP加端口进行负载外,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。

1.3.2 四层和七层负载对比


(1)智能性

七层负载均衡由于具备OIS七层的所有功能,所以在处理用户需求上能更加灵活,从理论上讲,七层模型能对用户的所有跟服务端的请求进行修改。例如对文件header添加信息,根据不同的文件类型进行分类转发。四层模型仅支持基于网络层的需求转发,不能修改用户请求的内容。

(2)安全性

七层负载均衡由于具有OSI模型的全部功能,能更容易抵御来自网络的攻击;四层模型从原理上讲,会直接将用户的请求转发给后端节点,无法直接抵御网络攻击。

(3)复杂度

四层模型一般比较简单的架构,容易管理,容易定位问题;七层模型架构比较复杂,通常也需要考虑结合四层模型的混用情况,出现问题定位比较复杂。

(4)效率比

四层模型基于更底层的设置,通常效率更高,但应用范围有限;七层模型需要更多的资源损耗,在理论上讲比四层模型有更强的功能,现在的实现更多是基于http应用。

实际环境采用的方式:四层负载(LVS)+七层负载(Nginx)。


1.3.3 Nginx七层负载均衡实现


Nginx要实现七层负载均衡需要用到proxy_pass代理模块配置, Nginx的负载均衡是在Nginx的反向代理基础上把用户的请求根据指定的算法分发到一组【upstream虚拟服务池】。

1.4 Nginx负载均衡配置


nginx.conf

   upstream myserver{
          server 192.168.2.211:8082 max_fails=1 fail_timeout=10s weight=1;
          server 192.168.2.211:8083;
    }
    server {
        listen       9001;
        server_name  www.kangll.com;

        location /edu/ {
            proxy_pass http://myserver;
            root  html;
        }
    }

1.5 Nginx负载均衡状态


代理服务器在负载均衡调度中的状态有以下几个:

状态

概述

down

当前的server暂时不参与负载均衡

backup

标记为备份服务器,当主机服务器停止时,请求发送到标记的服务器

max_fails

允许请求失败的次数, 在fail_timeout参数设置的时间内,如果该时间内,所有该服务器请求都失败了,那么认为服务器 停机

fail_timeout

经过max_fails次失败后,服务暂停的时间

max_conns

限制最大的接收连接数,默认为0,表示不限制,使用该配置可以根据后端服务器处理请求的并发量来进行设置,防止后端服务器被压垮。

1.6 Nginx负载均衡策略


策略

概述

轮询

每个请求按照时间顺序逐一分配到不同的后端服务器,如果后端服务器挂了,则自动删除

权重

指定轮询频率,weight和访问率成正比,用户后端服务器性能不均匀的情况,上文中

加了weight=1 表示权重是1,不加weight 默认是 1

ip_hash

每个请求按照IP的hash结果分配,这样每个访问用户固定访问一个后端服务器,可以解决

session共享问题。

fair

按照后端服务器的响应时间来分配请求,响应时间短的优先分配

url_hash

按照访问URL的hash 接过来分配请求,使每个URL定向到同一个后端服务器


二、负载均衡实战


2.1 测试服务器


IP

组件

端口

192.168.2.211

Tomcat

8080

192.168.2.154

Nginx

80

2.2 普通轮询


2.2.1 实现效果

浏览器中访问 kangll.com:9001/edu/a.html , 观察请求负载均衡的实现效果,请求平均分担到节点192.168.2.211:8082 和192.168.2.211:8083的两个端口。

2.2.2 准备工作

两个tomcat 里面webapps目录 中8083 的 Tomcat 的 webapps 文件夹下新建 edu 文件夹和 a.html 文件,填写内容为 "hello, 8083-Tomcat!" ,对应8082 的Tomcat a.html 文件,填写内容为 "hello, 8082-Tomcat!"

2.2.3 实现

nginx.conf 配置

   upstream myserver{
          server 192.168.2.211:8082;
          server 192.168.2.211:8083;
    }
    server {
        listen       80;
        server_name  www.kangll.com;

        location / {
            proxy_pass http://192.168.2.211:8080;
            index  index.html index.htm index.jsp;
        }
    }
    server {
        listen       9001;
        server_name  www.kangll.com;

        location /edu/ {
            proxy_pass http://myserver;
            root  html;
        }
    }

通过浏览器访问: kangll.com:9001/edu/a.html, 刷新页面 请求的两次 结果不一样。

2.3 weight加权(加权轮询)


        weight=number:用来设置服务器的权重,默认为1,权重数字越大,被分配到请求的几率越大。该权重值主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的,所以此策略比较适合服务器的硬件配置差别比较大的情况。

2.3.1 实现效果

浏览器中访问 kangll.com:9001/edu/a.html , 观察请求负载均衡的实现效果,请求平均分担到节点192.168.2.211:8082 和192.168.2.211:8083的两个端口。

2.3.2 准备工作

准备三个tomcat 里面webapps目录 中8083 的 Tomcat 的 webapps 文件夹下新建 edu 文件夹和 a.html 文件,填写内容为 "hello, 8083-Tomcat!" ,对应8082 的Tomcat a.html 文件,填写内容为 "hello, 8082-Tomcat!",对应8081 的Tomcat a.html 文件,填写内容为 "hello, 8081-Tomcat!"

2.3.3 实现

配置文件 nginx.conf

http {
   ...
    upstream myserver{
          server 192.168.2.211:8081 weight=10;
          server 192.168.2.211:8082 weight=5;
          server 192.168.2.211:8083 weight=5;
    }
 
    server {
        listen      9888;
        server_name www.kangll.com;

        location ~ / {
           # 被代理服务器的地址, 可以配置主机、ip 或者地址加端口
            proxy_pass http://myserver;
            index a.html;
            proxy_set_header Host $host;
            proxy_set_header X-real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

}

通过浏览器访问:http://www.kangll.com:9888/edu/a.html 页面刷新 10次, 访问到的 比例为:4:3: 3 。

2.4 ip_hash


       对后端的多台动态应用服务器做负载均衡时,ip_hash指令能够将某个客户端IP的请求通过哈希算法定位到同一台后端服务器上。当来自某一个IP的用户在后端Web服务器A上登录后,再访问该站点的其他URL,能保证其访问的还是后端web服务器A,可以解决session共享问题。

典型例子:用户首次访问一个系统是需要进行登录身份验证的,首先将请求跳转到Tomcat1服务器进行处理,登录信息是保存在Tomcat1 上的,这时候进行别的操作,那么可能会将请求轮询到第二个Tomcat2上,那么由于Tomcat2 没有保存会话信息,会以为该用户没有登录,然后继续登录一次,如果有多个服务器,每次第一次访问都要进行登录,这显然是很影响用户体验的。

      nginx 基于 IP 路由负载,每次都将同一个 IP 地址发送的请求都分发到同一个 Tomcat 服务器,那么也不会存在 session 共享的问题。

配置文件 nginx.conf

http {
   ...
    upstream myserver{
          ip_hash;
          server 192.168.2.211:8081;
          server 192.168.2.211:8082;
          server 192.168.2.211:8083;
    }
 
    server {
        listen      9888;
        server_name www.kangll.com;

        location ~ / {
           # 被代理服务器的地址, 可以配置主机、ip 或者地址加端口
            proxy_pass http://myserver;
            index a.html;
            proxy_set_header Host $host;
            proxy_set_header X-real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

}

注意:使用ip_hash指令无法保证后端服务器的负载均衡,可能导致有些后端服务器接收到的请求多,有些后端服务器接受的请求少,而且设置后端服务器权重等方法将不起作用。

2.5 url_hash


按访问url的hash结果来分配请求,使每个 url 定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再次收到请求,就可以从缓存中读取。

nginx.conf

upstream myserver{
          hash $request_uri;
          server 192.168.2.211:8081;
          server 192.168.2.211:8082;
          server 192.168.2.211:8083;
    }
 
    server {
        listen      9888;
        server_name www.kangll.com;

        location ~ / {
           # 被代理服务器的地址, 可以配置主机、ip 或者地址加端口
            proxy_pass http://myserver;
            index a.html;
            proxy_set_header Host $host;
            proxy_set_header X-real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

2.6 fair


fair采用的不是内建负载均衡使用的均衡算法,而是可以根据页面大小、加载时间长短智能地进行负载均衡。

nginx.conf

upstream myserver{
          fair;
          server 192.168.2.211:8081;
          server 192.168.2.211:8082;
          server 192.168.2.211:8083;
    }
 
    server {
        listen      9888;
        server_name www.kangll.com;

        location ~ / {
           # 被代理服务器的地址, 可以配置主机、ip 或者地址加端口
            proxy_pass http://myserver;
            index a.html;
            proxy_set_header Host $host;
            proxy_set_header X-real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

三、阿里云传统型负载均衡CLB


传统型负载均衡CLB(Classic Load Balancer)是将访问流量根据转发策略分发到后端多台云服务器的流量分发控制服务。CLB扩展了应用的服务能力,增强了应用的可用性。什么是传统型负载均衡CLB - 负载均衡 - 阿里云

3.1 概述


CLB通过设置虚拟服务地址,将添加的同一地域的多台云服务器虚拟成一个高性能和高可用的后端服务池,并根据转发规则,将来自客户端的请求分发给后端服务器池中的云服务器。

CLB默认检查云服务器池中的云服务器的健康状态,自动隔离异常状态的云服务器,消除了单台云服务器的单点故障,提高了应用的整体服务能力。此外,CLB还具备抗DDoS攻击的能力,增强了应用服务的防护能力。

3.2 CLB组成


上图中灰色的云服务器代表该云服务器健康检查失败,流量不会转发到该云服务器上。

CLB由以下三个部分组成:

组成

说明

实例

一个CLB实例是一个运行的负载均衡服务,用来接收流量并将其分配给后端服务器。要使用负载均衡服务,您必须创建一个CLB实例,并至少添加一个监听和两台云服务器。

监听

监听用来检查客户端请求并将请求转发给后端服务器。监听也会对后端服务器进行健康检查。

后端服务器

后端服务器是一组接收前端请求的云服务器,目前CLB支持添加云服务器ECS(Elastic Compute Service)、弹性容器实例ECI(Elastic Container Instance)和弹性网卡ENI(Elastic Network Interface)作为后端服务器。您可以单独添加云服务器到后端服务器池,也可以通过虚拟服务器组或主备服务器组来批量添加和管理。更多信息,请参见:

  • 什么是云服务器ECS
  • 什么是弹性容器实例ECI
  • 弹性网卡ENI概述

3.3 产品优势


  • 高可用采用全冗余设计,无单点,支持同城容灾。根据流量负载进行弹性扩容,在流量波动情况下不中断对外服务。
  • 可扩展您可以根据业务的需要,随时增加或减少后端服务器的数量,扩展应用的服务能力。
  • 低成本与传统硬件负载均衡系统高投入相比,成本可下降60%。
  • 安全结合云盾,可提供5 Gbps的防DDoS攻击能力。
  • 高并发集群支持亿级并发连接,单实例最大支持100万并发。

3.4 阿里云控制台配置SLB


创建好的 SLB实例 服务地址是我们的公网IP

监控的是服务器组

可以看到 第一台 和第三台服务器我们给了相同的权重 100

总结:负载均衡之四层与七层_四层负载均衡_小魏的博客的博客-CSDN博客

nginx的七层和四层负载均衡_nginx七层和四层_小鱼儿&的博客-CSDN博客

Nginx——Nginx负载均衡_啊噢1231的博客-CSDN博客

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

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

相关文章

论文笔记--Won’t Get Fooled Again: Answering Questions with False Premises

论文笔记--Won’t Get Fooled Again: Answering Questions with False Premises 1. 文章简介2. 文章概括3 文章重点技术3.1 大模型面对FPQs的表现3.2 False QAs数据集3.3 训练和评估 4. 文章亮点5. 原文传送门 1. 文章简介 标题:Won’t Get Fooled Again: Answerin…

LLMs之LLaMA2:LLaMA2的简介(技术细节)、安装、使用方法(开源-免费用于研究和商业用途)之详细攻略

LLMs之LLaMA2:LLaMA2的简介(技术细节)、安装、使用方法(开源-免费用于研究和商业用途)之详细攻略 导读:2023年7月18日,Meta重磅发布Llama 2!这是一组预训练和微调的大型语言模型(LLM),规模从70亿…

(三)springboot实战——web新特性之函数式实现

前言 本节内容我们主要介绍一下web访问的另一种形式,通过函数式web实现一个restful风格的http请求案例。函数式web是spring5.2之后的一个新特性,可以通过函数去定义web请求的处理流程,使得代码更为简洁,耦合性也降低了。 正文 …

在vue3中配置ByteMD掘金同款markdown编辑器

最近因为想要一个富文本编辑器集合到项目中,在查找网上很多资料后,选择了ByteMD 编辑器,ByteMD 编辑器是字节跳动的掘金团队所开源的一个编辑器组件,还挺好用的,那如果要在vue3项目中配置ByteMD编辑器要如何配置呢&…

【YOLO】关闭控制台推理日志

问题 每次推理时,控制台都会打一条日志 消除方法 外部库里找到\site-packages\ultralytics\engine\predictor.py 将代码的282、283、292、293,这四行注释掉(v5和v8一样) 也可以搜关键词# Print time (inference-only)可以定位代…

基于PHP+ vue2 + element +mysql自主研发的医院不良事件上报系统

医院不良事件上报管理系统源码 不良事件上报是为了响应卫生部下发的等级医院评审细则中第三章第9条规定:医院要有主动报告医疗安全(不良)事件的制度与工作流程。由医疗机构医院或医疗机构报告医疗安全不良事件信息,利用报告进行研…

WEB安全测试通常要考虑的测试点

1、问题:没有被验证的输入 测试方法: 数据类型(字符串,整型,实数,等) 允许的字符集 最小和最大的长度 是否允许空输入 参数是否是必须的 重复是否允许 数值范围 特定的值(枚举型&a…

基于UDP的可靠传输,文件+目录(C++,Qt)

一、基础知识 UDP(UserDatagramProtocol)是一个简单的面向消息的传输层协议,尽管UDP提供标头和有效负载的完整性验证(通过校验和),但它不保证向上层协议提供消息传递,并且UDP层在发送后不会保留…

【Tomcat】无法将位于-的资源添加到Web应用程序-的缓存中,因为在清除过期缓存条目后可用空间仍不足 - 请考虑增加缓存的最大空间

1、问题 org.apache.catalina.webresources.Cache.getResource Unable to add the resource at [xxx] to the cache for web application [/xxx] because there was insufficient free space available after evicting expired cache entries - consider increasing the maxim…

为Android构建现代应用——设计原则

为Android构建现代应用——设计原则 - 掘金 state”是声明性观点的核心 在通过Compose或SwiftUI等框架设计声明性视图时,我们必须明确的第一个范式是State(状态)。UI组件结合了它的图形表示(View)和它的State(状态)。UI组件中发生变化的任何属性或数据都可以…

Kotlin~Observer观察者模式

概念 定义一对多的依赖关系,让多个观察者同时监听一个主题对象。 角色介绍 Subject:主题,也称被观察者,它是具有状态的对象维护着一个观察者列表。提供添加、删除和通知观察者的方法。ConcreteSubject:具体主题&…

mfc140.dll丢失的解决方法(最新解决方法)

一:mfc140.dll的作用: mfc140.dll的主要作用是提供了(简称MFC)的函数和资源,它是用于构建Windows应用程序的一组C类库。MFC是微软开发环境中提供的一个工具集,它封装了Windows操作系统的底层API&#xff0…

2.多线程-初阶(中)

文章目录 4. 多线程带来的的风险-线程安全 (重点)4.1 观察线程不安全4.2 线程安全的概念4.3 线程不安全的原因4.3.1原子性4.3.2可见性4.3.3代码顺序性 4.4 解决之前的线程不安全问题 5. synchronized[ˈsɪŋkrənaɪzd] 关键字-监视器锁monitor lock5.1 synchronized 的特性5.…

【限流】4 种常见的限流实现方案

在微服务应用中,考虑到技术栈的组合,团队人员的开发水平,以及易维护性等因素,一个比较通用的做法是,利用 AOP 技术 自定义注解实现 对特定的方法或接口进行限流。 下面基于这个思路来分别介绍下几种常用的限流方案的…

OceanBase 压测时为什么冻结阈值在变化?

本文从源码角度分析了 OceanBase 压测中冻结阈值动态变化的原因,并给出运维建议。 作者:张乾 外星人2号,兼任五位喵星人的铲屎官。 本文来源:原创投稿 爱可生开源社区出品,原创内容未经授权不得随意使用,转…

Redis两种持久化机制RDB和AOF详解(面试常问,工作常用)

redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失。幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Append Only File)。 在这里假设你已经了解了redis的基础…

微信小程序上,实现图片右上角数字显示

微信小程序上,实现图片右上角数字显示 直接上代码: 样式代码index.wxss如下: .circle_rednum {position: absolute;color: white;font-size: 13px;background-color: #EC2F43;width: 23px;height: 23px;line-height: 23px;left: 80%;top: …

RuntimeError: DataLoader worker (pid 2105929) is killed by signal: Killed.

PyTorch DataLoader num_workers Test - 加快速度 可以利用PyTorch DataLoader类的多进程功能来加快神经网络训练过程。 加快训练进程 为了加快训练过程,我们将利用DataLoader类的num_workers可选属性。 num_workers属性告诉DataLoader实例要使用多少个子进程进…

pytorch工具——pytorch中的autograd

目录 关于torch.tensor关于tensor的操作关于梯度gradients 关于torch.tensor 关于tensor的操作 x1torch.ones(3,3) xtorch.ones(2,2,requires_gradTrue) print(x1,\n,x)yx2 print(y) print(x.grad_fn) print(y.grad_fn)zy*y*3 outz.mean() print(z,out)注意 atorch.randn(2,…

SQL调优教程

SQL调优教程 基础方法论 任何计算机应用系统性能问题最终都可以归结为 1.cpu消耗 2.内存使用 3.对磁盘,网络或其他I/O设备的输入/输出(I/O)操作 遇到性能问题时,要判断的第一点就是“在这三种资源中,是否有哪一种资源达到了有问题的程度”&…