nginx配置负载均衡详解
在现代的 web 应用中,负载均衡是确保高可用性、可扩展性和稳定性的关键技术之一。Nginx 是一个非常流行的反向代理服务器和负载均衡器,它支持多种负载均衡策略,能够帮助将客户端的请求分发到多个后端服务器,以提高系统的整体性能和可靠性。
dokcer 镜像下载:Nginx1.27.1.tar
1. Nginx 负载均衡基本概念
负载均衡(Load Balancing)指的是通过分配客户端请求到多个服务器(也称为后端服务器或上游服务器),从而平衡各个服务器的负载。Nginx 支持以下几种负载均衡方法:
- 轮询(Round Robin):请求按顺序分发到所有后端服务器。
- 最少连接(Least Connections):请求分发到当前连接数最少的服务器。
- IP 哈希(IP Hash):根据客户端 IP 地址的 hash 值决定将请求发送到哪台服务器。
2. 配置 Nginx 负载均衡
2.1 基本负载均衡配置
在 Nginx 中配置负载均衡,通常需要配置一个 upstream 块来定义一组后端服务器,并在 server 块中将请求转发到这些服务器。
步骤 1: 修改 nginx.conf 文件来配置负载均衡。
http {upstream backend {# 服务器地址和端口server backend1.example.com;server backend2.example.com;server backend3.example.com;# 负载均衡策略# default is round robin (轮询)# server backend4.example.com;}server {listen 80;location / {proxy_pass http://backend; # 将请求转发到 upstream 后端服务器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;}}
}
2.2 负载均衡策略
轮询(Round Robin)
这是默认的负载均衡方式,Nginx 会将请求按顺序轮流分发到每个后端服务器。
upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;
}
最少连接(Least Connections)
使用最少连接策略时,Nginx 会将请求转发给当前连接数最少的后端服务器,这在负载不均匀时特别有用。
upstream backend {least_conn; # 使用最少连接策略server backend1.example.com;server backend2.example.com;server backend3.example.com;
}
IP 哈希(IP Hash)
通过使用 IP 哈希策略,Nginx 会根据客户端的 IP 地址来决定请求转发到哪台服务器。这可以确保同一客户端的请求始终转发到相同的服务器,从而避免会话问题。
upstream backend {ip_hash; # 使用 IP 哈希server backend1.example.com;server backend2.example.com;server backend3.example.com;
}
2.3 设置权重
你可以为每个后端服务器设置不同的权重,这样就能控制请求的分发比例。例如,你可以给某台性能较强的服务器设置更高的权重,确保它处理更多的请求。
upstream backend {server backend1.example.com weight=3; # 权重 3server backend2.example.com weight=2; # 权重 2server backend3.example.com weight=1; # 权重 1
}
在这个例子中,backend1.example.com 会处理 3 倍于 backend3.example.com 的请求。
2.4 健康检查
Nginx 通过 fail_timeout 和 max_fails 配置来控制服务器的健康检查。当后端服务器在一定时间内失败的次数超过 max_fails 配置时,Nginx 会将其从负载均衡池中暂时移除,避免发送请求到故障的服务器。
upstream backend {server backend1.example.com max_fails=3 fail_timeout=30s;server backend2.example.com max_fails=3 fail_timeout=30s;server backend3.example.com max_fails=3 fail_timeout=30s;
}
max_fails:指定服务器在fail_timeout时间内允许的最大失败次数。fail_timeout:指定服务器在多长时间内无法正常响应时被认为是失败的。
2.5 配置负载均衡的重定向(代理请求头)
通常我们会希望把客户端的 IP 地址、原始主机名等信息传递到后端服务器,避免请求丢失这些信息。Nginx 提供了多种方法来设置请求头,常见的做法是设置 X-Real-IP 和 X-Forwarded-For。
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;
}
3. 高级负载均衡配置
3.1 负载均衡与缓存
Nginx 可以与缓存机制结合使用,以提高负载均衡的效率。可以使用 proxy_cache 来缓存从后端服务器获取的响应,这有助于减轻后端的负担,提高处理请求的速度。
http {proxy_cache_path /tmp/cache keys_zone=my_cache:10m;upstream backend {server backend1.example.com;server backend2.example.com;}server {location / {proxy_cache my_cache;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;}}
}
在这个例子中,proxy_cache 用来缓存来自后端服务器的响应。
3.2 使用 SSL 进行加密
如果后端服务需要加密通信,可以通过 SSL 配置进行保护。你可以在 Nginx 中为 upstream 配置 SSL。
upstream backend {server backend1.example.com:443 ssl;server backend2.example.com:443 ssl;
}server {listen 443 ssl;server_name www.example.com;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/cert.key;location / {proxy_pass https://backend;}
}
3.3 动态添加后端服务器
在某些场景下,你可能希望能够动态地添加或删除后端服务器而不重启 Nginx。这可以通过 nginx 的 nginx -s reload 命令来实现。动态更新可以配合监控和自动化脚本进行。
4. 总结
Nginx 配置负载均衡的基本步骤是:
- 使用
upstream定义后端服务器集群。 - 配置负载均衡算法:轮询、最少连接或 IP 哈希。
- 配置健康检查机制,确保故障服务器不会接收到流量。
- 配置代理请求头,转发原始客户端信息到后端服务器。
负载均衡不仅能提高网站的可用性和扩展性,还能帮助减轻单台服务器的负载。在高可用性和高流量场景下,Nginx 是一个强大的负载均衡解决方案。
相关文章:
nginx配置负载均衡详解
在现代的 web 应用中,负载均衡是确保高可用性、可扩展性和稳定性的关键技术之一。Nginx 是一个非常流行的反向代理服务器和负载均衡器,它支持多种负载均衡策略,能够帮助将客户端的请求分发到多个后端服务器,以提高系统的整体性能和…...
传奇996_19——龙岭总结
功能: 切割 切割属性: 即人物属性,可以设置临时属性或者永久属性,龙岭使用的是临时属性,所谓临时就是存在有效期,龙岭设置的有效期是123456789秒,即1428.89802天。 龙岭写法(倒叙…...
el-table 行列文字悬浮超出屏幕宽度不换行的问题
修改前的效果 修改后的效果 ui框架 element-plus 在网上找了很多例子都没找到合适的 然后这个东西鼠标挪走就不显示 控制台也不好调试 看了一下El-table的源码 他这个悬浮文字用的el-prpper 包着的 所以直接改 .el-table .el-propper 设置为max-width:1000px 就可以了 吐槽一…...
鸿蒙HarmonyOS 网络请求获取数据Http
注意的是;要为接口返回值指定类型 ,以及定义接口数据类型 index.ets import { http } from kit.NetworkKit;interface createAtType {date: number,}interface dataListType {createAt: createAtType;imgUrl: }Component export default struct TabBar {State dat…...
MySQL技巧之跨服务器数据查询:高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中
MySQL技巧之跨服务器数据查询:高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中 基础篇已经描述:借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的…...
JavaScript逆向爬虫教程-------基础篇之JavaScript密码学以及CryptoJS各种常用算法的实现
目录 一、密码学介绍 1.1 为什么要学密码学?1.2 密码学里面学哪一些 二、字符编码三、位运算四、Hex 编码与 Base64 编码 4.1 Hex 编码4.2 Base64 编码 五、消息摘要算法 5.1 简介5.2 JS中的MD5、SHA、HMAC、SM3 六、对称加密算法 6.1 介绍6.2 加密模式和填充方式6.3 CryptoJ…...
【分布式】万字图文解析——深入七大分布式事务解决方案
分布式事务 分布式事务是指跨多个独立服务或系统的事务管理,以确保这些服务中的数据变更要么全部成功,要么全部回滚,从而保证数据的一致性。在微服务架构和分布式系统中,由于业务逻辑往往会跨多个服务,传统的单体事务…...
apache2配置多站点
环境 ubuntu 14.04 apache2 Server version: Apache/2.4.7 (Ubuntu) Server built: Apr 3 2019 18:04:25 步骤 修改/etc/apache2/sites-enabled/000-default.conf 增加VirtualHost段,指定不同的ServerName、DocumentRoot等参数 <VirtualHost *:80>…...
基于PyQt Python的深度学习图像处理界面开发(一)
Python标准库更多的适合处理后台任务,唯一的图形库tkinter使用起来很不方便,所以后来出现了针对Python图形界面开发的扩展库,例如PyQt。 在介绍PyQt之前,必须先简单介绍一下Qt。Qt是一个C可视化开发平台,是一个跨平台的…...
【Linux网络】Linux网络编程套接字,UDP与TCP
📝个人主页🌹:Eternity._ ⏩收录专栏⏪:Linux “ 登神长阶 ” 🌹🌹期待您的关注 🌹🌹 ❀Linux网络编程套接字 📒1. 端口号📜2. 初识TCP协议与UDP协议…...
Vue3 -- 强制统一包管理器工具【企业级项目配置保姆级教程6】
引言: 团队开发项目的时候,需要统一包管理器工具,因为不同包管理器工具下载同一个依赖,可能版本不一样,导致项目出现bug问题,因此包管理器工具需要统一管理!!所以就需要我们强制统一包管理器工具。 创建scripts目录和preinstall.js文件: 在根目录创建scritps/preinstal…...
Winform实现自制浏览器JavaScript注入
让我们一起走向未来 🎓作者简介:全栈领域优质创作者 🌐个人主页:百锦再新空间代码工作室 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[1504566…...
【工具插件类教学】在 Unity 中使用 iTextSharp 实现 PDF 文件生成与导出
目录 一、准备工作 1. 安装 iTextSharp 2. 准备资源文件 二、创建 ExportPDFTool 脚本 1、初始化 PDF 文件,设置字体 2、添加标题、内容、表格和图片 三、使用工具类生成 PDF 四、源码地址 在 Unity 项目中,我们有时会需要生成带有文本、表格和图片的 PDF 文件,以便…...
javascript用来干嘛的?赋予网站灵魂的语言
javascript用来干嘛的?赋予网站灵魂的语言 在互联网世界中,你所浏览的每一个网页,背后都有一群默默工作的代码在支撑着。而其中,JavaScript就像是一位技艺精湛的魔术师,它赋予了网页生命力,让原本静态的页…...
Flutter Getx状态管理
在 Flutter 开发中,状态管理是一个非常重要的话题。随着应用变得更加复杂,状态管理的方式也变得越来越多。Flutter 提供了多种状态管理的解决方案,如 Provider、Riverpod、BLoC 等,而在这些选项中,GetX 作为一个轻量级…...
《成法》读书笔记
稻盛和夫的《成法》是一部关于个人和企业成功哲学的作品,结合了他在经营京瓷和KDDI,以及重建日航(JAL)过程中的经验和智慧。 以下是这本书的读书笔记,涵盖其核心思想和重要概念: 1. 以“心”为本 内容概…...
TensorFlow 2.0 环境配置
官方文档:CUDA Installation Guide for Windows 官方文档有坑,windows的安装指南直接复制了linux的指南内容:忽略这些离谱的信息即可。 可以从官方文档知悉,cuda依赖特定版本的C编译器。但是我懒得为了一个编译器就下载整个visua…...
Ekman理论回归
Scientific reportsEkman revisited: Surface currents to the left of the winds in the Northern HemisphereVagn Walfrid Ekman1905年的理论描述了地球旋转受到风的作用,摩擦边界层中的流场,北半球总是在海表风的右侧,南半球总是在海表风的…...
算法演练----24点游戏
给定4个整数,数字范围在1~13之间任意使用-*/(),构造出一个表达式,使得最终结果为24, 方法一 算法分析:加括号和取出重复表达式 # 导入精确除法模块,使得在Python2中除法运算的行为更…...
【学习心得】Python好库推荐——tiktoken
一、tiktoken是什么? tiktoken是一个快速BPE分词器,是由 OpenAI 开发的一个用于文本处理的 Python 库,主要用于将文本编码为数字序列(称为 "tokens"),或将数字序列解码为文本。这一过程被称为 &q…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
