Nginx系列之 一 负载均衡

目录

一、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.mfbz.cn/a/44179.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习深度学习——softmax回归(上)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——线性回归的简洁实现 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所…

vue项目打包成App

地址一 地址二 一、将项目开发完成后,在vue.config.js 文件中添加路径 publicPath:‘./’ 在router/index.js关闭路由的history模式(默认哈希) 二、npm run build,生成的dist文件目录 三、打开 HBuilder X 开发工具 新建 >…

SAMStable-Diffusion集成进化!分割、生成一切!AI绘画新玩法

自SAM「分割一切」模型推出之后,二创潮就开始了,有想法有行动!飞桨AI Studio开发者会唱歌的炼丹师就创作出SAM进化版,将SAM、Stable Diffusion集成,实现「分割」、「生成」能力二合一,并部署为应用&#xf…

吴恩达ChatGPT《LangChain Chat with Your Data》笔记

文章目录 1. Introduction2. Document Loading2.1 Retrieval Augmented Generation(RAG)2.2 Load PDFs2.3 Load YouTube2.4 Load URLs2.5 Load Notion 3. Document Splitting3.1 Splitter Flow3.2 Character Splitter3.3 Token Splitter3.4 Markdown Spl…

Cisco学习笔记(CCNA)——Open Shortest Path First (OSPF)

Open Shortest Path First (OSPF) 动态路由协议介绍 动态路由协议: 向路由表中添加远程网络 探索网络 更新和维护路由表 自主网络探索: 通过共享路由表信息路由器能探索到新的网络 动态路由协议的分类 内部网关协议(IGP) 适…

基于STM32设计的人体健康监护系统(华为云IOT)

一、设计需求 1.1 设计需求总结 根据需求,要求设计一款基于 STM32 的人体健康监护系统。采用系统模块化思路进行,将多个数模传感器收集到的数据和操作指令一并送至 STM32 中心处理器进行处理分析。 该系统可以实时监测被测者的心率、体温以及周围环境的温度,也同时可以通…

半导体自动化专用除静电设备的特点和功能

半导体自动化专用离子风机是一种用于半导体制造过程中的特殊风机设备。它通过产生带电粒子(离子)的气流来实现静电去除和除尘,以确保半导体制造环境的洁净和无尘。 以下是半导体自动化专用离子风机的一些特点和功能: 1. 静电去除…

【Vue3基础】计算属性

一、需求 二、代码 1、创建项目 创建项目: 1、 npm init vuelatest 2、一路回车 3、输入项目名,不要大写,如vue3bilibili 4、 cd vue3bilibili 5、 npm install 6、npm run dev启动,可以获取网址 2、App.vue文件中:…

Linux文件管理

WINDOWS/LINUX目录对比 Windows: 以多根的方式组织文件 C:\ D:\ E: Linux: 以单根的方式组织文件 / (根目录) Linux目录简介 /目录结构: FSH (Filesystem Hierarchy Standard) [rootlocalhost ~]# ls / bin dev lib media net root srv usr boot etc lib64 misc …

【Spring Boot Admin】介绍以及使用

介绍 概述 Spring Boot Admin是一个监控工具,旨在以一种漂亮且易于访问的方式可视化Spring Boot Actuators提供的信息。 主要功能点 显示应用程序的监控状态应用程序上下线监控查看 JVM,线程信息可视化的查看日志以及下载日志文件动态切换日志级别Http…

技术速览|Meta Llama 2 下一代开源大型语言模型

AI 使用大型语言模型(LLM)来理解和生成自然语言。LLM 可以从大量文本中学习并创建有关各种主题的文本,并可以完成比如编写代码、生成歌词、总结文章等任务。但有些 LLM 相关课程成本高昂且封闭,而现有的开放课程数量十分有限。这就…

机器学习深度学习——预备知识(上)

深大的夏令营已经结束,筛选入营的保研er就筛选了1/3,280多的入营总人数里面双非只有30左右。 最终虽然凭借机试拿到offer了,但是我感受到了自己的明显短板,比如夏令营的舍友就都有一篇核心论文,甚至还有SCI一区一作的。…

Docker数据管理和网络通信 dockerfile

Docker数据管理和网络通信 dockerfile 一:Docker 的数据管理1.数据卷2.数据卷容器 二:端口映射三:容器互联(使用centos镜像)四:Docker 镜像的创建1.基于现有镜像创建2&am…

证书文件无法生成.p12

做好的证书文件在生成.p12文件的过程中遇到了.p12选项置灰且无法选择并导出的情况 解决办法 起初认为生成的空白 CertificateSigningRequest 有问题,反反复复尝试几次制作后均无效; 而后发现问题出在了钥匙串访问的选项问题上 ... 将顶部菜单 tab 由"所有选项"切换至…

从不同的使用场景认识STag26

当你买下STag26时, 你买到的是什么? 如果你是商超生鲜区的经理, 你买到的是在促销旺季时的高效与安心。 你不用再担心价格没有及时更新, 导致水果蔬菜的滞销。 毕竟,STag26能够一键改价,实时更新&#x…

项目:点餐系统1

项目简介:实现一个http点餐系统服务器,能够支持用户在浏览器访问服务器获取餐馆首页,进行菜品以及订单管理。 具体模型如下: 用户分类: 管理员:进行订单以及菜品管理(菜品&订单的增删改查&a…

【C#】using

文章目录 global 修饰符using 别名结合“global 修饰符”和“using 别名”static 修饰符来源 global 修饰符 向 using 指令添加 global 修饰符意味着 using 将应用于编译中的所有文件(通常是一个项目)。 global using 指令被添加到 C# 10 中。 其语法为…

LiveGBS流媒体平台GB/T28181功能-视频直播流媒体平台分屏展示设备树分组树记录上次分屏播放记录

LiveGBS视频直播流媒体平台分屏展示设备树分组树记录上次分屏播放记录 1、分屏展示1.1、单屏1.2、四分屏1.3、九分屏1.4、十六分屏 2、分屏记录3、搭建GB28181视频直播平台 1、分屏展示 LiveGBS分屏页面支持,多画面播放,支持单屏、四分屏、九分屏、十六…

Java-API简析_java.net.Proxy类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/131881661 出自【进步*于辰的博客】 因为我发现目前,我对Java-API的学习意识比较薄弱…

xcode15启动IOS远程调试

1.用数据线连接IPhone到macOS 2.打开xcode15,然后点击Window->Devices and Simulators 3.选中左边的Devices可看到已连接的IPhone,然后点击Connect via network使其选中. 选择后,左边的IPhone设备的右边出现一个地球图标,表示成功通过网络连接到IPhone 现在可断开数据线的…
最新文章