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技术报告,专注于无人机(UAV)在3GPP系统中的增强支持。文章提出了多个无人机应用场景,分析了相应的能力要求,并建议了新的服务级别要求和关键性能指标(KPIs)。…...
python的私有属性和数据封装
1.私有属性 在 Python 中,私有属性是一种编程约定,用于表示某些属性在类的内部使用,不希望被外部直接访问或修改。 私有属性的命名通常以双下划线 __ 开头。例如,在类中定义一个私有属性可以像这样: class MyClass:de…...
一文学会鉴别“套壳”ChatGPT模型
一文学会鉴别“套壳”ChatGPT模型 随着ChatGPT等明星模型的诞生,市场上也开始出现一些“套壳”现象,即部分模型表面标榜原创或先进,实则在核心算法上与知名模型高度相似。作为技术探索者,如何拨开迷雾,识别这些“李鬼…...
Docker基本管理1
Docker 概述 Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”。 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自…...
python-28-零基础自学python-json存数据、读数据,及程序合并
学习内容:《python编程:从入门到实践》第二版 知识点: import json引入、 try-except-else return def函数、打开文件、 练习内容: 练习10-11:喜欢的数 编写一个程序,提示用户输入喜欢的数ÿ…...
Excel第30享:基于辅助列的条件求和
1、需求描述 如下图所示,现要统计2022年YTD(Year To Date:年初至今日)各个人员的“上班工时(a2)”。 下图为系统直接导出的工时数据明细样例。 2、解决思路 Step1:确定逻辑。“从日期中提取出…...
Java查看RSA密钥的ASN1结构
背景:服务端使用Java开发的,接口需要客户端传一个RSA公钥,手机端使用Flutter开发的,然后就选择使用 pointycastle 生成密钥,很不巧,dart版本不像Java一样有个可以直接获取编码过的公钥信息的方法࿱…...
友思特方案 | 低延迟GigE Vision解决方案:用于红外设备、医疗和工业级探测面板
导读 维持实时视频系统软硬件的长期成本效益,是该系统在医疗、工业等领域广泛应用的前提。友思特低延迟GigE Vision解决方案创新性地突破了这一难题,提供高带宽且高可靠性的端到端网络链接,有效降低了开发成本、复杂性和时间。 引言 虽然实…...
网络安全策略:优先防护而非溯源的重要性
面对网络攻击,企业往往面临一个关键决策点:是立即投入资源进行攻击溯源,还是优先加强自身的防御体系。尽管溯源分析有助于了解攻击者的手段和动机,但在大多数情况下,优先强化防护是更为明智的选择。本文将探讨为何在遭…...
ES6 Iterator 与 for...of 循环(五)
Iterator 特性: 统一的接口:无论是数组、字符串还是自定义对象,只要它们有默认的迭代器,就可以使用 for…of 循环进行遍历。可迭代对象:具有 [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零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
PopClip(Mac 划词增强工具)值得购买吗?
PopClip 是一款 Mac 划词操作增强工具,可选装翻译搜索、格式转换等丰富扩展,联动多种软件执行创建提醒事项、添加到笔记等快捷操作,有效提升工作效率。 在 iPhone 或 iPad 内,选词后就会弹出气泡菜单,让你选择执行各种…...
Python | Leetcode Python题解之第227题基本计算器II
题目: 题解: 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语言实现的,c语言中是自带字符串的,但是为什么redis还要再实现自己的动态字符串呢,这种动态字符串的底层数据结构是怎样的呢?接下来我们带着这些问题来看一看redis中的动态字符串sds。 2.sds的组成 struct __at…...
路由协议的优先级,以及管理距离 AD 和 metric 的区别
路由协议的优先级(Preference,即管理距离 Administrative Distance )一般为一个 0 到 255 之间的数字,数字越大则优先级越低。表一是通常情况下各路由协议的优先级规定: 表一:一般路由协议优先级 路由协议…...
力扣 24两两交换链表中节点
画图 注意有虚拟头结点 注意判断时先判断cur->next ! nullptr,再判断cur->next->next ! nullptr 注意末尾返回dumyhead->next,用新建result指针来接并返回 class Solution { public:ListNode* swapPairs(ListNode* head) {ListNode *dummyhead new …...
C# + halcon 联合编程示例
C# halcon 联合编程示例 实现功能 1.加载图像 2.画直线,画圆,画矩形, 画椭圆 ROI,可以调整大小和位置 3.实现找边,找圆功能 效果 开发环境 Visual Studio 2022 .NET Framework 4.8 halcondotnet.dll 查看帮助文档 项目结构 DL…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
