提升网站性能:Nginx五种高效负载均衡策略

前言

本文收录于我是沐风晓月的csdn专栏《linux基本功-系统服务实战》, 关于nginx的系列后面会汇总起来,关注我,一起学习与成长。

本专栏写作的过程中,联合了csdn几位大佬,目前正在整理更新目录,力争让大家学到一些真东西,将所学的理论落地,帮助你更快的提升自己。

学技术最难的地方,其实是找到最优资料的过程,这次联合几位csdn的云原生方向的博主大佬,一起打造易学,易懂,落地的架构和云原生专栏。

文章目录

  • 前言
  • 一. 重点知识回顾
    • 1.1 Nginx内核与模块划分
    • 1.2 Nginx模块处理流程
    • 1.3 nginx负载均衡的作用
  • 二. 负载均衡的算法
    • 2.1 关于负载均衡的理论回顾
    • 2.2 目前nginx常用的算法
      • 1. 轮询(默认方式)
      • 2. 权重策略(weight 加权轮询)
      • 3. ip_hash
      • 4. fair
      • 5. url_hash
      • 6. least_conn
  • 总结

一. 重点知识回顾

1.1 Nginx内核与模块划分

  1. 内核

其设计非常微小和简洁,完成的工作也非常简单。仅通过查找配置文件将客户端请求映射到一个location block(location是nginx配置中的一个指令,用例URL匹配),而在这个location中所配置的每个指令将会启动不同的模块取完成相应的工作。

  1. 从结构上划分:
  • 核心模块:HTTP模块、EVENT模块和MAIL模块。 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP
  • Proxy模块和HTTP Rewrite模块。 第三方模块:HTTP Upstream Request
  • Hash模块、Notice模块和HTTP Access Key模块。

一般我们需要记住 模块名字即可,做到心里有底。

  1. 从功能上划分
  • Core(核心模块):构建nginx基础服务、管理其他模块。
  • Handlers(处理器模块):此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。
  • Filters (过滤器模块):此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
  • Proxies (代理类模块):此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务
    比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

1.2 Nginx模块处理流程

  1. 收到HTTP请求。
  2. Nginx基于配置文件中的位置选择一个合适的处理模块(Handlers)。
  3. Handlers模块需要把请求反向代理到后端服务器,就需要就变成另外一类的模块:load-balancers(负载均衡模块)
  4. 负载均衡模块的配置中有一组后端服务器,当一个HTTP请求过来时,它决定哪台服务器应当获得这个请求。
  5. 处理完成后,filters(过滤模块)将被调用。每个请求都可以被压缩成块,依次经过多个filters过。它们的执行顺序在编译时决定。过滤模块链以流水线的方式高效率地向客户端发送响应信息。每个filters不会等上一个filters全部完成,就像是流水线一样。
  6. 最后把响应发给客户端。

Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者

1.3 nginx负载均衡的作用

  • 解决服务器的高并发压力,提高应用程序的处理性能;
  • 提供故障转移,实现高可用;
  • 通过添加或减少服务器数量,增强网站的可扩展性;
  • 在负载均衡器上进行过滤,可以提高系统的安全性。

二. 负载均衡的算法

2.1 关于负载均衡的理论回顾

负载均衡,就是 Nginx 把请求均匀的分摊给上游的应用服务器,这样即使某一个服务器宕机也不会影响请求的处理,或者当应用服务器扛不住了,可以随时进行扩容。
在这里插入图片描述
nginx将客户端的请求,根据相应的规则分发到部署项目的后端服务器,比如tomcat。 这里的相应规则其实就是在配置文件中指定:pass_proxy指令以及upstream指令。

静态负载均衡的算法: 主要包括 轮询算法,基于比率的加权轮询算法或者基于优先级的加权轮询算法;
动态负载均衡的算法: 主要包括基于任务量的最少连接优化算法、基于性能的最快响应优先算法、预测算法及动态性能分配算法等;

一般动态的负载均衡算法更加适用于复杂的网络环境。

负载均衡都是基于OSI七层模型来划分的:

OSI七层模型:

  1. 物理层:比特流传输
  2. 数据链路层:控制网络层与物理层之间的通信;
  3. 网络层:IP寻址和路由选择;
  4. 传输层:建立、维护、管理端到端的连接,常见的有TCP/UDP;
  5. 会话层:建立、维护、管理会话连接;
  6. 表示层:对数据进行格式化、编码、加密、压缩等操作;
  7. 应用层:为应用程序提供网络服务;
  • 四层负载是在传输层,基于IP+port的负载均衡,常见的有:
硬件:F5、BIG-IP、Radware等;
 软件:LVS、Nginx、Hayproxy等

nginx 增加了一个stream模块,用来实现四层协议的转发,代理,负载均衡等。

stream模块的用法跟http的用法类似,允许我们配置一组TCP或者UDP等协议的监听,然后通过proxy_pass来转发我们的请求,通过upstream添加多个后端服务,实现负载均衡;

要使用stream的模式,需要在编译的时候加上 --with-stream才能用。

  • 七层负载均衡主要在应用层,主要基于虚拟的URL或者主机的IP的负载均衡:
实现七层负载均衡的方式:
    软件:Nginx、Hayproxy等

2.2 目前nginx常用的算法

Nginx的upstream支持如下六种方式的分配算法,分别是:

算法名称说明
轮询默认方式
weight权重方式
ip_hash依据ip分配方式
least_conn依据最少连接方式
url_hash依据URL分配方式
fair依据响应时间方式

1. 轮询(默认方式)

轮询是upstream模块负载均衡默认的策略,每个请求会按时间顺序逐个被分配到不同的后端服务器。轮询不需要额外的配置.

upstream mufengserver{
        server  192.168.1.41:8080;
        server  192.168.1.42:8081;
    }
server {
		listen 80;
		server_name localhost;
location / {
			# mufengserver 就是服务器组的名称
			proxy_pass http://mufengserver/;
		}
	}

2. 权重策略(weight 加权轮询)

weitht=number后面的weight参数越高,任务也就越多,权重数字越大,被分配到请求的几率越大,默认为1;
用于在服务器性能不均衡的情况下使用,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的,所有此策略比较适合服务器的硬件配置差别比较大的情况。

比如你的服务器 4C8G 和 8C16G 的服务器都有,那么这时候就可以对服务器设置一些权重,让性能好的承担更多的请求。

upstream mufengserver{
        server  192.168.1.41:9001 weight=5;
        server  192.168.1.42:9002 weight=1;
    }
server {
		listen 8080;
		server_name localhost;
		
		location / {
			# mufengserver 就是服务器组的名称
			proxy_pass http:/mufengserver/;
		}
	}

3. ip_hash

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

	# 代理服务器
	# 设置服务器组
	upstream mufengserver{
        ip_hash;
		server localhost:9001;
		server localhost:9002;
		server localhost:9003;
	}
	server {
		listen 8080;
		server_name localhost;
		
		location / {
			# backend 就是服务器组的名称
			proxy_pass http://mufengserver/;
		}
	}

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

4. fair

fair 主要根据访问的时间来分配任务,根据页面的大小,加载时间长短等智能的进行负载均衡;
要使用第三方模块fair必须安装upstream_fair模块;

upstream myserver{
        server  192.168.137.13:8082;
        server  192.168.137.13:8081;
        fair;
    }
server {
		listen 8080;
		server_name localhost;
		
		location / {
			# mufengserver 就是服务器组的名称
			proxy_pass http://mufengserver/;
}
}

5. url_hash

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

	# 代理服务器
	# 设置服务器组
	upstream mufengserver {
        hash $request_uri;
		server localhost:9001;
		server localhost:9002;
		server localhost:9003;
	}
	server {
		listen 8080;
		server_name localhost;
		
		location / {
			# mufengserver 就是服务器组的名称
			proxy_pass http://mufengserver;
		}
	}

6. least_conn

least_conn:最少连接,把请求转发给连接数较少的后端服务器。

轮询算法是把请求平均地转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

这种方式适合请求处理时间长短不一造成服务器过载的情况。

	
	upstream mufengserver{
        least_conn;
		server localhost:9001;
		server localhost:9002;
		server localhost:9003;
	}
	server {
		listen 8080;
		server_name localhost;
		
		location / {
			# mufengserver 就是服务器组的名称
			proxy_pass http://mufengserver/;
		}
	}

总结

💕 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!
💕 本文由沐风晓月原创,首发于CSDN博客, 博客主页:mufeng.blog.csdn.net
💕 学习如逆水行舟,不进则退,一起努力加油哦!
💕 喜欢的话记得点赞收藏哈

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

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

相关文章

多线程代码案例-阻塞队列

hi,大家好,今天为大家带来多线程案例--阻塞队列 这块知识点也很重要,要好好掌握呀~~~ 🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸🌸&#x…

【蓝桥杯_练习】

蓝桥杯1.创建工程2.LED灯点亮led.c3.LCD液晶屏显示lcd.c4.定时器按键单机interrupt.hinterrupt.cman.c5.定时器(长按键)interrupt.hinterrupt.cmain.c6.PWMmain.c7.定时器-输入捕获(频率,占空比测量)interrupt.cmain.c…

中科亿海微FPGA应用(一、点灯)

1.软件: https://download.csdn.net/download/weixin_41784968/87564071 需要申请license才能使用:软件试用申请_软件试用申请_中科亿海微电子科技(苏州)有限公司 2.开发板: 芯片EQ6HL45,42.5k LUT。 3…

移植RK3568的串口

文章目录 前言一、代码位置二、硬件原理图三、修改设备树四、关闭串口调试功能总结前言 本文主要讲解如何移植RK3568的串口 提示:以下是本篇文章正文内容,下面案例可供参考 一、代码位置 drivers/tty/serial/8250/8250_core.c drivers/tty/serial/8250/8250_dma.c dma实现…

TCP协议详解

1.TCP的准备条件在古代的时候,古人们经常写书信进行交流,写书信的前提是你要知道这份信是要寄给谁在网络中,我们通过ip端口号找对目标对象,但是现在网站一般会对ip端口注册一个域名,所以我们一般就是对域名进行查找&am…

mysql的limit查询竟然有坑?

背景 最近项目联调的时候发现了分页查询的一个bug,分页查询总有数据查不出来或者重复查出。 数据库一共14条记录。 如果按照一页10条。那么第一页和第二页的查询SQL和和结果如下。 .png) 那么问题来了,查询第一页和第二页的时候都出现了11,12,13的记录…

又一款全新的基于 GPT4 的 Python 神器Cursor,关键还免费

chartgpt大火之后,随之而来的就是一大类衍生物了。 然后,今天要给大家介绍的是一款基于GPT4的新一代辅助编程神器——Cursor。 它最值得介绍的地方在于它免费,我们可以直接利用它来辅助我们编程,真正做到事半功倍。 注意&#…

大数据项目之数仓相关知识

第1章 数据仓库概念 数据仓库(DW): 为企业指定决策,提供数据支持的,帮助企业,改进业务流程,提高产品质量等。 DW的输入数据通常包括:业务数据,用户行为数据和爬虫数据等 ODS: 数据…

十二届蓝桥杯省赛c++(下)

1、 拿到题目一定要读懂题意&#xff0c;不要看到这题目就上来模拟什么闰年&#xff0c;一月的天数啥的。这个题目问你当天的时间&#xff0c;就说明年月日跟你都没关系&#xff0c;直接无视就好了。 #include <iostream> #include <cstring> #include <algori…

Nginx 教程-动静分离

一、Nginx 动静分离理论1、概念今天学习和梳理Nginx动静分离&#xff0c;动静分离是将网站静态资源&#xff08;HTML&#xff0c;JavaScript&#xff0c;CSS&#xff0c;img等文件&#xff09;与后台应用分开部署&#xff0c;之所以要进行动静分离&#xff0c;其一为了提高前端…

Qt示例3:用Qt画一个温度计

示例1 以下是用Qt绘制一个简单的温度计的示例代码&#xff1a; #include <QPainter> #include <QWidget> #include <QApplication> class Thermometer : public QWidget { public:Thermometer(QWidget *parent 0); protected:void paintEvent(QPaintEvent …

戴眼镜检测和识别1:戴眼镜检测数据集(含下载链接)

戴眼镜检测和识别1&#xff1a;戴眼镜检测数据集(含下载链接) 目录 戴眼镜检测和识别1&#xff1a;戴眼镜检测数据集(含下载链接) 1. 前言 2.Eyeglasses-Dataset数据集说明 3.Eyeglasses-Dataset数据集下载 4.戴眼镜检测和识别&#xff08;Python版本&#xff09; 5.戴眼…

JavaWeb——线程安全问题的原因和解决方案

目录 一、线程不安全的原因 1、抢占式执行、随机调度 2、多线程同时修改同一个变量 3、修改操作不是原子的 4、内存可见性 5、指令重排序 二、解决方法 1、使用synchronized方法加锁 &#xff08;1&#xff09;、定义 &#xff08;2&#xff09;、使用 &#xff08;3…

Github ChatGPT-Web:了解最新AI技术的前沿应用!

近年来OpenAI的ChatGPT模型在自然语言处理领域取得了很大的进展&#xff0c;并且已经在全球范围内得到了广泛的应用和普及。ChatGPT不仅可以用于生成对话和文本摘要等任务&#xff0c;还可以用于机器翻译、问答系统、情感分析等多个领域。ChatGPT已经成为自然语言处理领域的一个…

基于51单片机的自动打铃打鸣作息报时系统AT89C51数码管三极管时钟电路

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;单片机打铃 获取完整无水印论文报告说明&#xff08;含源码程序、电路原理图和仿真图&#xff09; 本次设计中的LED数码管电子时钟电路采用24小时制记时方式,本次设计采用AT89C51单片机的扩展芯片和6个PNP三极管做驱动&…

【C语言蓝桥杯每日一题】——跑步锻炼

【C语言蓝桥杯每日一题】—— 跑步锻炼&#x1f60e;前言&#x1f64c;排序&#x1f64c;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01;&#xff01;&#xff01; &#x1f60a;作者简介…

使用chatGPT实现数字自增动画

num-auto-add&#xff1a;数字自增动画 序言 我们经常在一些好的网站上遇到数字自增的动画效果&#xff0c;为用户提供了更加丰富的交互体验&#xff0c;看起来非常酷。 我之前也有写过&#xff0c;为了方便以后使用&#xff0c;打算将它优化&#xff0c;并上传到npm中。 首…

OpenCV入门(二十一)快速学会OpenCV 20 图像金字塔

OpenCV入门&#xff08;二十一&#xff09;快速学会OpenCV 20 图像金字塔1.基本概念2.高斯金字塔2.1 向下取样2.2 向上取样3.拉普拉斯金字塔作者&#xff1a;Xiou 1.基本概念 一般情况下&#xff0c;我们要处理的是一幅具有固定分辨率的图像。有些情况下&#xff0c;我们需要…

RabbitMQ 入门到应用 ( 六 ) 消息可靠性

7.RabbitMQ可靠性投递 为了保证信息不丢失, 可靠抵达,引入确认机制 消息从生产者传递到消费者的过程中, 不同的阶段使用不同的确认方式. 7.0.准备请求 一次性发送10 个消息 通过 new.exchange.direct交换机 接收消息, 使用 new.admin路由键 向 new.admin队列 发送消息. Aut…

【 构造 HTTP 请求 】

文章目录一、通过 form 表单构造 HTTP 请求1.1 form 发送 GET 请求1.2 form 发送 POST 请求二、通过 ajax 构造 HTTP 请求2.1 ajax 发送 GET 请求2.2 ajax 发送POST 请求2.3 关于 ajax三、通过 Java socket 构造 HTTP 请求(了解)一、通过 form 表单构造 HTTP 请求 form (表单)…