Nginx学习笔记(七)——Nginx负载均衡

⚖️ Nginx学习笔记(七)——Nginx负载均衡

📌 一、负载均衡核心概念

架构定位

分发请求
分发请求
分发请求
响应
响应
响应
聚合响应
客户端
Nginx负载均衡器
后端服务器1
后端服务器2
后端服务器3

核心价值

  • 📈 流量分发:将客户端请求均匀分配到多个后端服务器
  • 🛡️ 高可用保障:自动剔除故障节点,保障服务连续性
  • 性能扩展:通过增加后端节点提升系统吞吐量
  • 🔄 会话保持:确保用户请求路由到相同后端

⚙️ 二、基础配置语法

核心指令结构

http {# 定义服务器组upstream backend_group {# 负载均衡策略least_conn;# 服务器配置server 192.168.1.101:8080 weight=5; server 192.168.1.102:8080 max_fails=3 fail_timeout=30s;server backup.example.com:8080 backup;}server {location / {proxy_pass http://backend_group;  # 关键指令}}
}

关键参数详解

指令默认值作用
weight1服务器权重(越高分配越多请求)
max_fails1最大失败次数(触发熔断阈值)
fail_timeout10s熔断时间(故障节点暂停服务时长)
backup-标记为备用节点(主节点全宕时启用)
down-手动标记节点不可用

📊 三、负载均衡策略解析
1️⃣ 轮询策略(Round Robin)
upstream backend {# 默认策略,无需显式声明server 192.168.1.101;server 192.168.1.102;
}

📌 运作机制

客户端Nginx服务器1服务器2请求1转发请求1响应1返回响应1请求2转发请求2响应2返回响应2客户端Nginx服务器1服务器2
2️⃣ 加权轮询(Weighted Round Robin)
upstream backend {server 192.168.1.101 weight=3;  # 60%流量server 192.168.1.102 weight=2;  # 40%流量
}

⚖️ 流量分配公式

总权重 = 3 + 2 = 5
服务器1概率 = 3/5 = 60%
服务器2概率 = 2/5 = 40%
3️⃣ IP哈希策略(IP Hash)
upstream backend {ip_hash;  # 基于客户端IP计算哈希server 192.168.1.101;server 192.168.1.102;
}

🔐 会话保持原理

hash(客户端IP) % 服务器数量 = 固定分配的服务器索引
4️⃣ 最少连接(Least Connections)
upstream backend {least_conn;server 192.168.1.101;server 192.168.1.102;
}

📈 动态调度逻辑

选择连接数最少的节点
新请求
检查当前连接数
转发请求
更新节点连接计数
5️⃣ 随机策略(Random)
upstream backend {random;  # 随机选择后端节点server 192.168.1.101;server 192.168.1.102;
}

🎲 扩展加权随机

upstream backend {random two;  # 随机选两个节点再选最优server 192.168.1.101 weight=2;server 192.168.1.102 weight=1;
}

🩺 四、健康检查机制

双模式检测架构

基于请求响应
定时探测
被动检查
标记故障节点
主动检查
恢复可用节点

配置示例

upstream backend {zone backend_zone 64k;  # 共享内存区server 192.168.1.101;server 192.168.1.102;# 被动检查参数max_fails=3;fail_timeout=30s;# 主动检查参数(需nginx-plus)health_check interval=5s fails=3 passes=2 uri=/health;
}

健康状态流转

UP -> 连续失败max_fails次 -> DOWN
DOWN -> 经过fail_timeout -> 重新探测 -> UP

🧩 五、多场景实战案例
🔄 案例1:多协议负载均衡
# HTTP协议
http {upstream web {server 192.168.1.101:80;server 192.168.1.102:80;}
}# TCP协议(四层负载)
stream {upstream db {server 192.168.1.201:3306;server 192.168.1.202:3306;}
}# UDP协议
stream {upstream dns {server 192.168.1.211:53;server 192.168.1.212:53;}
}
🌐 案例2:跨数据中心部署
upstream global {# 欧洲集群server eu1.example.com weight=3;server eu2.example.com weight=3;# 北美集群server us1.example.com weight=2;server us2.example.com weight=2;# 故障转移设置server backup.aws.com backup;
}
🧪 案例3:金丝雀发布
upstream backend {# 正式环境(95%流量)server prod-v1:8080 weight=95;# 金丝雀环境(5%流量)server canary-v2:8080 weight=5;# 会话保持(确保测试用户一致性)sticky cookie srv_id expires=1h domain=.example.com;
}
🔐 案例4:会话持久化
# 基于Cookie的会话保持
upstream checkout {sticky cookie srv_id expires=1h domain=.shop.com path=/;server 192.168.1.101;server 192.168.1.102;
}# 基于路由的会话保持
upstream user_service {hash $request_uri consistent;  # 相同URI路由到相同节点server 192.168.1.101;server 192.168.1.102;
}

⚠️ 六、常见陷阱与解决方案
❌ 陷阱1:节点雪崩

现象

某节点故障导致大量请求重试到其他节点,引发连环宕机

解决方案

# 限制重试次数
proxy_next_upstream_tries 3; # 熔断机制
upstream backend {server 192.168.1.101 max_conns=100;  # 单节点最大并发queue 100 timeout=60s;               # 排队队列设置
}
❌ 陷阱2:会话不一致

现象

用户多次请求被分发到不同节点导致状态丢失

解决方案

# 启用会话保持
upstream backend {ip_hash; # 或使用 sticky 指令
}
❌ 陷阱3:健康检查失效

现象

节点实际已故障但未触发熔断

解决方案

# 调整健康检查敏感度
upstream backend {server 192.168.1.101 max_fails=2 fail_timeout=10s;# 主动检查(nginx-plus)health_check interval=2s fails=1 passes=1;
}

📊 七、监控与调优

关键监控指标

# 状态接口配置
location /upstream_status {stub_status;allow 127.0.0.1;deny all;
}

监控数据示例

Active connections: 291 
server accepts handled requests119789 119789 119387 
Reading: 6 Writing: 179 Waiting: 106 
Upstream: 2 active, 0 backup101.3.3.3:8080 weight=1 fail_timeout=10s max_fails=3 active:0 requests:12834 responses:12834 fail:0102.4.4.4:8080 weight=1 fail_timeout=10s max_fails=3active:1 requests:23912 responses:23912 fail:3

性能调优参数

events {worker_connections 10240;  # 单进程连接数上限
}http {# 连接复用优化proxy_http_version 1.1;proxy_set_header Connection "";# 缓冲区优化proxy_buffers 16 8k;proxy_buffer_size 4k;
}

📚 总结图谱

负载均衡核心
策略体系
健康检查
会话管理
性能调优
轮询/加权/哈希
最少连接/随机
被动检查
主动探测
Cookie保持
URI哈希
连接复用
缓冲区优化

🔗 扩展阅读

  • Nginx官方负载均衡文档
  • 大规模负载均衡架构设计

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MQ积压如何处理

处理消息队列(MQ)积压是一个需要系统化分析的运维挑战。下面我将结合常见原因,分步骤说明处理方案,并区分应急措施和根本解决方案:​一、快速诊断积压原因(核心!)​​​监控告警分析…

Unity与OpenGL中的材质系统详解

引言 在现代3D图形开发中,材质是定义物体外观的核心元素。Unity引擎提供了强大且直观的材质系统,使得开发者能够轻松实现复杂的视觉效果。然而,对于熟悉OpenGL的开发者来说,理解Unity材质系统的工作原理以及如何在OpenGL中实现类…

k8s安装DragonflyDB取代redis

数据库类型线程模型吞吐量 (QPS)延迟 (μs)内存效率适用场景兼容性Memcached纯内存键值存储多线程100K - 500K10 - 100高缓存、会话存储无原生密码认证DragonflyDB多协议内存数据库多线程1M50 - 200中高高吞吐缓存、Redis 替代兼容 RedisKeyDBRedis 多线程分支多线程500K - 1M5…

Horse3D游戏引擎研发笔记(五):在QtOpenGL环境下,仿three.js的BufferGeometry管理VAO和EBO绘制四边形

一、背景介绍 在三维图形渲染中,几何形状的管理是引擎的核心功能之一。Three.js通过BufferGeometry接口实现了对顶点数据和索引数据的高效管理,而OpenGL则通过顶点数组对象(VAO)和元素数组对象(EBO)来实现…

Ping32 与 IP-GUARD 深度对比:Ping32,引领企业数据安全新方向

在数字化时代,企业数据宛如珍贵的宝藏,是推动业务发展、保持竞争优势的核心资产。但与此同时,数据安全威胁也如影随形,内部员工的误操作、恶意窃取,外部黑客的攻击,都可能让企业数据面临泄露风险&#xff0…

洛谷 P2842 纸币问题 1 -普及-

题目描述 某国有 nnn 种纸币,每种纸币面额为 aia_iai​ 并且有无限张,现在要凑出 www 的金额,试问最少用多少张纸币可以凑出来? 输入格式 第一行两个整数 n,wn,wn,w,分别表示纸币的种数和要凑出的金额。 第二行一行 nn…

第十四节:物理引擎集成:Cannon.js入门

第十四节:物理引擎集成:Cannon.js入门 引言 物理引擎为3D世界注入真实感,让物体遵循重力、碰撞和动量等物理规律。Cannon.js是Three.js生态中最强大的物理引擎之一,本文将深入解析其核心机制,并通过Vue3实现物理沙盒系…

二十四、Mybatis-基础操作-删除(预编译SQL)

mybatis环境准备概述与注意事项(springboot项目引入三项必要的起步依赖)项目目录结构mybatis基础操作-删除对应EmpMapper(接口)代码 package com.itheima.mapper;import org.apache.ibatis.annotations.*;Mapper public interface…

JavaScript 核心基础:类型检测、DOM 操作与事件处理

JavaScript 作为松散类型语言,掌握类型检测规则、DOM 元素获取方式及事件处理逻辑,是写出健壮代码的基础。本文系统梳理 JS 高频基础知识点,结合实战场景解析原理与用法,帮你建立清晰的知识框架。 一、JS 数据类型与类型检测&…

软件开发过程中的维护活动

软件开发过程中的维护活动软件维护是软件生命周期中持续时间最长、成本最高的阶段,它并非简单的“修理”,而是一系列旨在延长软件生命周期、保持其价值和适应性的工程化活动。研究表明,软件维护成本可占总成本的60%以上。理解并有效管理维护活…

STC8单片机驱动I2C屏幕:实现时间、日期与温湿度显示

STC8 单片机驱动 I2C 屏幕:实现时间、日期与温湿度显示 在单片机项目中,“数据可视化” 是核心需求之一 —— 将时间、温湿度等关键信息实时显示在屏幕上,能让项目更具实用性。本文以STC8 系列单片机为核心,搭配 I2C 接口的 OLED…

基于SpringBoot+Vue的智能消费记账系统(AI问答、WebSocket即时通讯、Echarts图形化分析)

🎈系统亮点:AI问答、WebSocket即时通讯、Echarts图形化分析;一.系统开发工具与环境搭建1.系统设计开发工具后端使用Java编程语言的Spring boot框架 项目架构:B/S架构 运行环境:win10/win11、jdk17前端: 技术…

[论文笔记] WiscKey: Separating Keys from Values in SSD-Conscious Storage

阅读 WiscKey 论文时随手记录一些笔记。 这篇论文的核心思想理解起来还是很简单的,但是具体涉及到实现还有一些想不明白的地方,后来看到 TiKV 的 Titan 实现也很有趣,索性把这些问题都记录下来并抛出来。 本文中和论文相关的内容&#xff0…

week1-[循环嵌套]画正方形

week1-[循环嵌套]画正方形 题目描述 输入一个正整数 nnn,请使用数字 000 到 999 拼成一个这样的正方形图案(参考样例输入输出):由上至下、由左至右依次由数字 000 到 999 填充。每次使用数字 999 填充后,将从头使用数字…

在 Vue2 中使用 pdf.js + pdf-lib 实现 PDF 预览、手写签名、文字批注与高保真导出

本文演示如何在前端(Vue.js)中结合 pdf.js、pdf-lib 与 Canvas 技术实现 PDF 预览、图片签名、手写批注、文字标注,并导出高保真 PDF。 先上demo截图,后续会附上代码仓库地址(目前还有部分问题暂未进行优化&#xff0…

tomcat 定时重启

tomcat 定时重启 定时重启的目的是:修复内存泄漏等问题,tomcat 长时间未重启,导致页面卡顿,卡死,无法访问,影响用户访问 1.编写脚本 su - tomcat [tomcat@u1abomap02 ~]$ ls restart_tomcat_gosi.sh tomcat_gosi.log vi restart_tomcat_gosi.sh #!/bin/bash# 定义日志目…

WinForm 简单用户登录记录器实现教程

目录 功能概述 实现思路 一、程序入口(Program.cs) 二、登录用户控件(Login.cs) 2.1 控件初始化与密码显示逻辑 2.2 登录控件设计器(Login.Designer.cs) 三、主窗体(Form1.cs&#xff09…

docker 安装 使用

Docker安装 一键安装命令 sudo curl -fsSL https://get.docker.com| bash -s docker --mirror Aliyun启动docker sudo service docker startpull镜像加速配置 sudo vi /etc/docker/daemon.json输入下列内容,最后按ESC,输入 :wq! 保存退出。 {"regis…

无人机探测器技术解析

一、工作模式 无人机探测器通过多模式协同实现全流程防御闭环: 1. 主动扫描模式 雷达主动探测:发射电磁波(如Ka/Ku波段),通过回波时差与多普勒频移计算目标距离、速度及航向,适用于广域扫描(…

Linux学习-软件编程(进程与线程)

进程回收wait原型:pid_t wait(int *wstatus); 功能:回收子进程空间 参数:wstatus:存放子进程结束状态空间的首地址 返回值:成功返回回收到的子进程的PID失败返回-1WIFEXITED(wstatus):测试进程是否正常结束…