当前位置: 首页 > news >正文

Nginx 负载均衡详解

Nginx是一个高性能的HTTP和反向代理服务器,拥有丰富的功能和模块,负载均衡就是其中之一。负载均衡是一种技术,用于在多台服务器之间分配工作负载,以确保高可用性和可靠性。本文将详细介绍Nginx的负载均衡算法、工作原理、配置方法和实际应用。

一、负载均衡概述

负载均衡是指将用户的请求分配到多个后端服务器上进行处理,以达到优化资源利用率、提高响应速度和增加系统的可靠性的目的。负载均衡器通常位于用户和服务器之间,接收用户的请求,并根据某种算法将请求分发给合适的后端服务器。

二、Nginx的负载均衡算法

Nginx支持多种负载均衡算法,每种算法适用于不同的场景和需求。以下是Nginx常用的几种负载均衡算法:

1. 轮询(Round Robin)

轮询算法是最简单的负载均衡算法之一,它按照顺序将请求依次分发给每个后端服务器。当所有服务器都被分配了一次请求后,重新开始下一轮分配。

优点:

  • 简单易实现。
  • 适用于后端服务器性能相近的情况。

缺点:

  • 无法考虑服务器的负载情况。
  • 不适用于后端服务器性能差异较大的情况。

配置示例:

http {upstream backend {server backend1.example.com;server backend2.example.com;}server {location / {proxy_pass http://backend;}}
}
2. 最少连接数(Least Connections)

最少连接数算法将请求分配给当前活动连接数最少的后端服务器。这种算法适用于长连接的场景,例如WebSocket、数据库连接等。

优点:

  • 考虑了服务器的负载情况。
  • 适用于长连接场景。

缺点:

  • 需要维护连接状态,开销较大。

配置示例:

http {upstream backend {least_conn;server backend1.example.com;server backend2.example.com;}server {location / {proxy_pass http://backend;}}
}
3. IP哈希(IP Hash)

IP哈希算法根据客户端IP地址的哈希值将请求分配给后端服务器。这样,同一个客户端的请求总是被分配到同一台后端服务器,从而实现会话粘性(Session Persistence)。

优点:

  • 适用于需要会话粘性的场景。
  • 简单实现会话粘性。

缺点:

  • 负载分布不均衡,可能导致部分服务器负载过高。

配置示例:

http {upstream backend {ip_hash;server backend1.example.com;server backend2.example.com;}server {location / {proxy_pass http://backend;}}
}
4. URL哈希(URL Hash)

URL哈希算法根据请求URL的哈希值将请求分配给后端服务器。这样,相同URL的请求总是被分配到同一台后端服务器。

优点:

  • 适用于缓存场景,提高缓存命中率。
  • 简单实现URL粘性。

缺点:

  • 负载分布不均衡,可能导致部分服务器负载过高。

配置示例:
使用第三方模块,如ngx_http_upstream_hash_module

http {upstream backend {hash $request_uri;server backend1.example.com;server backend2.example.com;}server {location / {proxy_pass http://backend;}}
}
5. 加权轮询(Weighted Round Robin)

加权轮询算法在轮询的基础上,为每台后端服务器分配一个权重。权重越高,分配到的请求越多。适用于后端服务器性能差异较大的情况。

优点:

  • 考虑了服务器性能差异。
  • 灵活分配请求。

缺点:

  • 需要手动配置权重。

配置示例:

http {upstream backend {server backend1.example.com weight=3;server backend2.example.com weight=1;}server {location / {proxy_pass http://backend;}}
}

三、Nginx负载均衡配置

Nginx的负载均衡配置主要通过upstream模块实现。upstream定义了一组后端服务器,并指定负载均衡算法。在server块中,通过proxy_pass指令将请求转发给upstream组。

基本配置

以下是一个基本的Nginx负载均衡配置示例:

http {upstream backend {server backend1.example.com;server backend2.example.com;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
}
健康检查

Nginx可以配置健康检查,以确保请求只分配给健康的后端服务器。可以使用ngx_http_upstream_check_module模块实现健康检查。

配置示例:

http {upstream backend {server backend1.example.com;server backend2.example.com;check interval=5000 rise=2 fall=5 timeout=3000;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;}}
}

四、Nginx负载均衡实践

1. 高可用性配置

为了实现高可用性,可以配置多个Nginx实例,并使用Keepalived实现Nginx的高可用性。

Keepalived配置示例:

vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.100}
}virtual_server 192.168.1.100 80 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 50protocol TCPreal_server 192.168.1.101 80 {weight 1TCP_CHECK {connect_timeout 10nb_get_retry 3delay_before_retry 3}}real_server 192.168.1.102 80 {weight 1TCP_CHECK {connect_timeout 10nb_get_retry 3delay_before_retry 3}}
}
2. 动态负载均衡

Nginx Plus支持动态负载均衡,可以通过API动态添加或删除后端服务器,提高灵活性和可扩展性。

配置示例:

http {upstream backend {zone backend 64k;server backend1.example.com;server backend2.example.com;}server {location /api {api write=on;allow 127.0.0.1;deny all;}}server {listen 80;location / {proxy_pass http://backend;}}
}

五、总结

Nginx作为一个高性能的HTTP服务器和反向代理服务器,提供了多种负载均衡算法,包括轮询、最少连接数、IP哈希、URL哈希和加权轮询等。不同的算法适用于不同的场景,可以根据实际需求选择合适的算法。通过合理配置Nginx的负载均衡,可以提高系统的性能和可靠性,确保服务的高可用性和稳定性。

相关文章:

Nginx 负载均衡详解

Nginx是一个高性能的HTTP和反向代理服务器,拥有丰富的功能和模块,负载均衡就是其中之一。负载均衡是一种技术,用于在多台服务器之间分配工作负载,以确保高可用性和可靠性。本文将详细介绍Nginx的负载均衡算法、工作原理、配置方法…...

Unity3D开发之传送带实现

/// <summary> /// 传送带 直线传送带 /// </summary> public class ConveyerBelt : MonoBehaviour {public float Speed 1;protected float mspeed;protected Vector3 direction;protected Rigidbody rd;List<GameObject> Goods new List<GameObject&…...

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(二)-支持高分辨率视频直播应用

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…...

python的私有属性和数据封装

1.私有属性 在 Python 中&#xff0c;私有属性是一种编程约定&#xff0c;用于表示某些属性在类的内部使用&#xff0c;不希望被外部直接访问或修改。 私有属性的命名通常以双下划线 __ 开头。例如&#xff0c;在类中定义一个私有属性可以像这样&#xff1a; class MyClass:de…...

一文学会鉴别“套壳”ChatGPT模型

一文学会鉴别“套壳”ChatGPT模型 随着ChatGPT等明星模型的诞生&#xff0c;市场上也开始出现一些“套壳”现象&#xff0c;即部分模型表面标榜原创或先进&#xff0c;实则在核心算法上与知名模型高度相似。作为技术探索者&#xff0c;如何拨开迷雾&#xff0c;识别这些“李鬼…...

Docker基本管理1

Docker 概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自…...

python-28-零基础自学python-json存数据、读数据,及程序合并

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; import json引入、 try-except-else return def函数、打开文件、 练习内容&#xff1a; 练习10-11&#xff1a;喜欢的数 编写一个程序&#xff0c;提示用户输入喜欢的数&#xff…...

Excel第30享:基于辅助列的条件求和

1、需求描述 如下图所示&#xff0c;现要统计2022年YTD&#xff08;Year To Date&#xff1a;年初至今日&#xff09;各个人员的“上班工时&#xff08;a2&#xff09;”。 下图为系统直接导出的工时数据明细样例。 2、解决思路 Step1&#xff1a;确定逻辑。“从日期中提取出…...

Java查看RSA密钥的ASN1结构

背景&#xff1a;服务端使用Java开发的&#xff0c;接口需要客户端传一个RSA公钥&#xff0c;手机端使用Flutter开发的&#xff0c;然后就选择使用 pointycastle 生成密钥&#xff0c;很不巧&#xff0c;dart版本不像Java一样有个可以直接获取编码过的公钥信息的方法&#xff1…...

友思特方案 | 低延迟GigE Vision解决方案:用于红外设备、医疗和工业级探测面板

导读 维持实时视频系统软硬件的长期成本效益&#xff0c;是该系统在医疗、工业等领域广泛应用的前提。友思特低延迟GigE Vision解决方案创新性地突破了这一难题&#xff0c;提供高带宽且高可靠性的端到端网络链接&#xff0c;有效降低了开发成本、复杂性和时间。 引言 虽然实…...

网络安全策略:优先防护而非溯源的重要性

面对网络攻击&#xff0c;企业往往面临一个关键决策点&#xff1a;是立即投入资源进行攻击溯源&#xff0c;还是优先加强自身的防御体系。尽管溯源分析有助于了解攻击者的手段和动机&#xff0c;但在大多数情况下&#xff0c;优先强化防护是更为明智的选择。本文将探讨为何在遭…...

ES6 Iterator 与 for...of 循环(五)

Iterator 特性&#xff1a; 统一的接口&#xff1a;无论是数组、字符串还是自定义对象&#xff0c;只要它们有默认的迭代器&#xff0c;就可以使用 for…of 循环进行遍历。可迭代对象&#xff1a;具有 [Symbol.iterator] 属性的对象被认为是可迭代的。[Symbol.iterator] 是一个…...

typora删除多余图片

import os import re import shutil from bs4 import BeautifulSoupimport warningswarnings.filterwarnings(ignore) # 定义正则表达式用于匹配.md文件中的图片引用语句 pattern re.compile(r!\[.*]\((.*)\))# 获取所有.md文件中的图片引用路径 references set() md_filepat…...

【ceph】ceph-mon重新选举的情况

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…...

PopClip(Mac 划词增强工具)值得购买吗?

PopClip 是一款 Mac 划词操作增强工具&#xff0c;可选装翻译搜索、格式转换等丰富扩展&#xff0c;联动多种软件执行创建提醒事项、添加到笔记等快捷操作&#xff0c;有效提升工作效率。 在 iPhone 或 iPad 内&#xff0c;选词后就会弹出气泡菜单&#xff0c;让你选择执行各种…...

Python | Leetcode Python题解之第227题基本计算器II

题目&#xff1a; 题解&#xff1a; class Solution:def calculate(self, s: str) -> int:n len(s)stack []preSign num 0for i in range(n):if s[i] ! and s[i].isdigit():num num * 10 ord(s[i]) - ord(0)if i n - 1 or s[i] in -*/:if preSign :stack.append(…...

redis源码分析之底层数据结构(一)-动态字符串sds

1.绪论 我们知道redis是由c语言实现的&#xff0c;c语言中是自带字符串的&#xff0c;但是为什么redis还要再实现自己的动态字符串呢&#xff0c;这种动态字符串的底层数据结构是怎样的呢?接下来我们带着这些问题来看一看redis中的动态字符串sds。 2.sds的组成 struct __at…...

路由协议的优先级,以及管理距离 AD 和 metric 的区别

路由协议的优先级&#xff08;Preference&#xff0c;即管理距离 Administrative Distance &#xff09;一般为一个 0 到 255 之间的数字&#xff0c;数字越大则优先级越低。表一是通常情况下各路由协议的优先级规定&#xff1a; 表一&#xff1a;一般路由协议优先级 路由协议…...

力扣 24两两交换链表中节点

画图 注意有虚拟头结点 注意判断时先判断cur->next ! nullptr,再判断cur->next->next ! nullptr 注意末尾返回dumyhead->next&#xff0c;用新建result指针来接并返回 class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode *dummyhead new …...

C# + halcon 联合编程示例

C# halcon 联合编程示例 实现功能 1.加载图像 2.画直线&#xff0c;画圆&#xff0c;画矩形, 画椭圆 ROI&#xff0c;可以调整大小和位置 3.实现找边&#xff0c;找圆功能 效果 开发环境 Visual Studio 2022 .NET Framework 4.8 halcondotnet.dll 查看帮助文档 项目结构 DL…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...