【Nginx-4】Nginx负载均衡策略详解
在现代Web应用中,随着用户访问量的增加,单台服务器往往难以承受巨大的流量压力。为了解决这一问题,负载均衡技术应运而生。Nginx作为一款高性能的Web服务器和反向代理服务器,提供了多种负载均衡策略,能够有效地将请求分发到多个服务器上,从而提高系统的可用性和性能。
本文将详细介绍Nginx中常用的负载均衡策略,并探讨它们的优缺点及适用场景。
1. 轮询(Round Robin)
1.1 策略描述
轮询是Nginx默认的负载均衡策略。在这种策略下,Nginx会按照请求的顺序依次将请求分发到后端服务器上。每个请求都会被分配到下一个服务器,直到所有服务器都被轮询一遍,然后重新开始。
1.2 配置示例
http {upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;location / {# upstream的名字proxy_pass http://backend;}}
}
1.3 优点
- 简单易用:轮询策略是Nginx的默认策略,无需额外配置。
- 负载均衡:能够均匀地将请求分发到各个服务器上,避免单台服务器过载。
1.4 缺点
- 不考虑服务器性能:轮询策略不考虑后端服务器的实际负载情况,可能导致性能较差的服务器被频繁访问。
1.5 适用场景
- 后端服务器性能相近,且负载均衡的主要目的是均匀分发请求。
2. 加权轮询(Weighted Round Robin)
2.1 策略描述
加权轮询是在轮询的基础上引入了权重(weight)的概念。通过为不同的服务器设置不同的权重,Nginx可以根据权重比例来分配请求。权重越高的服务器将获得更多的请求。
2.2 配置示例
http {upstream backend {# weight=权重比例server backend1.example.com weight=3;server backend2.example.com weight=2;server backend3.example.com weight=1;}server {listen 80;location / {# upstream的名字proxy_pass http://backend;}}
}
2.3 优点
- 灵活性高:可以根据服务器的性能设置不同的权重,从而更好地利用资源。
- 负载均衡:能够根据权重比例分发请求,避免性能较差的服务器被频繁访问。
2.4 缺点
- 配置复杂:需要根据服务器的性能手动设置权重,增加了配置的复杂性。
2.5 适用场景
- 后端服务器性能差异较大,且需要根据性能分配请求。
3. IP哈希(IP Hash)
3.1 策略描述
IP哈希策略通过将客户端的IP地址进行哈希计算,然后将请求分发到对应的后端服务器上。相同的IP地址总是会被分发到同一个服务器上,这样可以保证用户的会话一致性。
3.2 配置示例
http {upstream backend {ip_hash; # 启用 IP 哈希负载均衡策略server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;location / {proxy_pass http://backend;}}
}
3.3 优点
- 会话保持:相同的IP地址总是会被分发到同一个服务器上,适合需要保持会话的应用场景。
- 简单配置:只需在upstream块中添加
ip_hash
指令即可。
3.4 缺点
- 负载不均:如果某些IP段的请求量较大,可能导致某些服务器负载过高。
- 扩展性差:当后端服务器数量发生变化时,可能会导致IP哈希结果发生变化,影响会话一致性。
3.5 适用场景
- 需要保持会话一致性的应用,如登录状态、购物车等。
4. 最少连接(Least Connections)
4.1 策略描述
最少连接策略会将请求分发到当前连接数最少的服务器上。这种策略能够更好地平衡服务器的负载,避免某些服务器因为连接数过多而过载。
4.2 配置示例
http {upstream backend {least_conn;server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;location / {proxy_pass http://backend;}}
}
4.3 优点
- 负载均衡:能够根据服务器的实际连接数进行负载均衡,避免某些服务器过载。
- 动态调整:能够根据服务器的实时负载情况动态调整请求分发。
4.4 缺点
- 复杂性:需要实时监控服务器的连接数,增加了系统的复杂性。
4.5 适用场景
- 后端服务器性能差异较大,且需要根据实时负载情况进行负载均衡。
5. 加权最少连接(Weighted Least Connections)
5.1 策略描述
加权最少连接策略结合了最少连接和加权轮询的优点。在这种策略下,Nginx会根据服务器的权重和当前连接数来决定将请求分发到哪台服务器上。
5.2 配置示例
http {upstream backend {least_conn;server backend1.example.com weight=3;server backend2.example.com weight=2;server backend3.example.com weight=1;}server {listen 80;location / {proxy_pass http://backend;}}
}
5.3 优点
- 灵活性高:可以根据服务器的性能和当前负载情况进行负载均衡。
- 负载均衡:能够更好地平衡服务器的负载,避免某些服务器过载。
5.4 缺点
- 配置复杂:需要根据服务器的性能和负载情况手动设置权重,增加了配置的复杂性。
5.5 适用场景
- 后端服务器性能差异较大,且需要根据实时负载情况进行负载均衡。
6. 哈希(Hash)
6.1 策略描述
哈希策略允许用户根据自定义的键值(如URL、请求头等)进行哈希计算,然后将请求分发到对应的后端服务器上。这种策略适合需要根据特定条件进行负载均衡的场景。
6.2 配置示例
http {upstream backend {hash $request_uri;server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;location / {proxy_pass http://backend;}}
}
6.3 优点
- 灵活性高:可以根据自定义的键值进行负载均衡,适合特定的应用场景。
- 会话保持:相同的键值总是会被分发到同一个服务器上,适合需要保持会话一致性的应用。
6.4 缺点
- 负载不均:如果某些键值的请求量较大,可能导致某些服务器负载过高。
- 扩展性差:当后端服务器数量发生变化时,可能会导致哈希结果发生变化,影响会话一致性。
6.5 适用场景
- 需要根据特定条件进行负载均衡的应用,如根据URL、请求头等。
总结
Nginx提供了多种负载均衡策略,每种策略都有其独特的优缺点和适用场景。在实际应用中,选择合适的负载均衡策略可以显著提高系统的性能和可用性。以下是一些常见的选择建议:
- 轮询:适合后端服务器性能相近的场景。
- 加权轮询:适合后端服务器性能差异较大的场景。
- IP哈希:适合需要保持会话一致性的应用。
- 最少连接:适合后端服务器性能差异较大,且需要根据实时负载情况进行负载均衡的场景。
- 加权最少连接:适合后端服务器性能差异较大,且需要根据实时负载情况进行负载均衡的场景。
- 哈希:适合需要根据特定条件进行负载均衡的应用。
通过合理选择和配置负载均衡策略,可以有效地提升系统的性能和稳定性,为用户提供更好的访问体验。
相关文章:
【Nginx-4】Nginx负载均衡策略详解
在现代Web应用中,随着用户访问量的增加,单台服务器往往难以承受巨大的流量压力。为了解决这一问题,负载均衡技术应运而生。Nginx作为一款高性能的Web服务器和反向代理服务器,提供了多种负载均衡策略,能够有效地将请求分…...

Python 的 Decimal的错误计算
摘要 阐述在使用 Python的 Decimal类时,可能产生的错误计算。 在 详述 BigDecimal 的错误计算 中,笔者较为详细地说明了 Java的 BigDecimal可能出错的原因。类似地,Python的 decimal模块中有个 Decimal类,也可用于高精度的十进制…...

【韩顺平 Java满汉楼项目 控制台版】MySQL+JDBC+druid
文章目录 功能界面用户登录界面显示餐桌状态预定显示所有菜品点餐查看账单结账退出满汉楼 程序框架图项目依赖项目结构方法调用图功能实现登录显示餐桌状态订座显示所有菜品点餐查看账单结账退出满汉楼 扩展思考多表查询如果将来字段越来越多怎么办? 员工信息字段可…...

【HAL库】STM32CubeMX开发----STM32F407----Time定时器中断实验
STM32CubeMX 下载和安装 详细教程 【HAL库】STM32CubeMX开发----STM32F407----目录 前言 本次实验以 STM32F407VET6 芯片为MCU,使用 25MHz 外部时钟源。 实现定时器TIM3中断,每1s进一次中断。 定时器计算公式如下: arr 是自动装载值&#x…...

react18+ts 封装图表及词云组件
react18ts 封装图表及词云组件 1.下载依赖包 "echarts": "^5.5.1","echarts-for-react": "^3.0.2","echarts-wordcloud": "^2.1.0",2.创建目录结构 3.代码封装 ChartCard.tsx Wordcloud.tsx 4.调用 import Rea…...
图像根据mask拼接时,边缘有色差 解决
目录 渐变融合(Feathering) 沿着轮廓线模糊: 代码: 泊松融合 效果比较好: 效果图: 源代码: 泊松融合,mask不扩大试验 效果图: 源代码: 两个图像根据mask拼接时,边缘有色差 渐变融合(Feathering) import numpy as np import cv2# 假设 img1, img2 是两个…...

17、ConvMixer模型原理及其PyTorch逐行实现
文章目录 1. 重点2. 思维导图 1. 重点 patch embedding : 将图形分割成不重叠的块作为图片样本特征depth wise point wise new conv2d : 将传统的卷积转换成通道隔离卷积和像素空间隔离两个部分,在保证精度下降不多的情况下大大减少参数量 2. 思维导图 后续再整…...
Spring整合Redis基本操作步骤
Spring 整合 Redis 操作步骤总结 1. 添加依赖 首先,在 pom.xml 文件中添加必要的 Maven 依赖。Redis 相关的依赖包括 Spring Boot 的 Redis 启动器和 fastjson(如果需要使用 Fastjson 作为序列化工具): <!-- Spring Boot Re…...

STM32使用SFUD库驱动W25Q64
SFUD简介 SFUD是一个通用SPI Flash驱动库,通过SFUD可以库轻松完成对SPI Flash的读/擦/写的基本操作,而不用自己去看手册,写代码造轮子。但是SFUD的功能不仅仅于此:①通过SFUD库可以实现在一个项目中对多个Flash的同时驱动&#x…...

ArKTS基础组件
一.AlphabetIndexer 可以与容器组件联动用于按逻辑结构快速定位容器显示区域的组件。 子组件 color:设置文字颜色。 参数名类型必填说明valueResourceColor是 文字颜色。 默认值:0x99182431。 selectedColor:设置选中项文字颜色。 参数名类型必填说明valueRes…...
如何理解TCP/IP协议?如何理解TCP/IP协议是什么?
理解TCP/IP协议 1. 什么是TCP/IP协议? TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是一组用于实现网络通信的协议,广泛用于互联网和局域网中。TCP/IP协议栈由一系列协议组成,规定了计算机如何在网络中发送和接收数据。它通常被用来…...
如何使用 Python 连接 SQLite 数据库?
SQLite是一种轻量级的嵌入式数据库,广泛应用于各种应用程序中。 Python提供了内置的sqlite3模块,使得连接和操作SQLite数据库变得非常简单。 下面我将详细介绍如何使用sqlite3模块来连接SQLite数据库,并提供一些实际开发中的建议和注意事项…...

【博弈模型】古诺模型、stackelberg博弈模型、伯特兰德模型、价格领导模型
博弈模型 1、古诺模型(cournot)(1)假设(2)行为分析(3)经济后果(4)例题 2、stackelberg博弈模型(产量领导模型)(1ÿ…...
单片机:实现花样灯数码管的显示(附带源码)
单片机实现花样灯数码管显示 数码管(七段数码管)广泛用于数字显示,例如时钟、计数器、温度计等设备。在本项目中,我们将使用单片机实现花样灯数码管的显示效果。所谓花样灯显示是指通过控制数码管上的各个段位,以不同…...

什么是芯片电阻
有人把Chip Resistor翻译成“芯片电阻”,我觉得翻译成“贴片电阻”或“片状电阻”更合适。有些厂商也称之为”电阻片”,英文写作Resistor Chip。比如:Thick film resistor chips(厚膜电阻片)、Thin film resistor chip…...
【C++】sophus : geometry.hpp 位姿(SE2 和 SE3)和(2D 直线\3D 平面)转换函数 (五)
这段代码定义了一系列在位姿(SE2 和 SE3)和几何实体(2D 直线和 3D 平面)之间进行转换的函数。它利用了 Sophus 库中已有的旋转表示(SO2 和 SO3)。 以下是函数的详细解释: 1. SO2 与直线…...
moment()获取时间
moment 是一个 JavaScript 日期处理类库。 使用: //安装 moment npm install moment -- save引用 //在main.js中全局引入 import moment from "moment"设定moment区域为中国 //import 方式 import moment/locale/zh-cn moment.locale(zh-cn); 挂载全…...
Azure虚拟机非托管磁盘大小调整
想要扩容一个Azure VM 的磁盘空间,门户里面竟然无法扩展,点点鼠标就完事的时代在离去,微软越来不想微软。 在门户里面即便使用Azure Cli命令行也不行。 PS /home/gpchina> az disk list [] 返回为空,根本没有返回磁盘。 不过使…...
流匹配模型[Flow Matching]
流匹配模型:概念、优缺点与扩散模型的对比 在生成建模领域,流匹配模型(Flow Matching)是一种通过学习流场将初始分布(通常是高斯噪声)变换为目标分布的新型框架。本文将对流匹配模型的概念、与扩散模型的联…...

Unix 和 Windows 的有趣比较
Unix 和 Windows NT 比较 来源于这两本书,把两本书对照来读,发现很多有意思的地方: 《Unix 传奇》 https://book.douban.com/subject/35292726/ 《观止 微软创建NT和未来的夺命狂奔 》 Showstopper!: The Breakneck Race to Create Windows…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...