Nginx负载均衡详解
一、负载均衡介绍
1、负载均衡的定义
单体服务器解决不了并发量大的请求,所以,我们可以横向增加服务器的数量(集群),然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
负载均衡的意思是在服务器集群中,需要有一台服务器作为调度者,客户端所有的请求都由调度者接收,调度者再根据每台服务器的负载情况,将请求分配给对应的服务器去处理。
在这个过程中,调度者如何合理分配任务,保证所有服务器将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡的需要处理的问题了。
2、nginx负载均衡
nginx在 nginx.conf配置文件中通过 upstream模块 和 server模块的配合使用,就可以实现负载均衡。
2.1 upstream 模块
upstream 模块:负载均衡模块,通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。
在http的 upstream模块中,可以通过 server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。
常用的状态有:
- weight:服务访问的权重,默认是1。
- down:表示当前的server暂时不参与负载均衡。
- backup:预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
- max_fails:在fail_timeout时间内,允许请求最大的失败次数,默认为1。当达到最大失败时,会在fail_timeout时间内不允许再次被选择。,返回 proxy_next_upstream 模块定义的错误。
- fail_timeout:单位为秒,默认是10秒。指定一段时间内,请求经历了max_fails次失败后,该server不能访问的时间(暂停服务的时间)。max_fails可以和fail_timeout一起使用。
注意:
当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是backup。
2.2 nginx负载均衡配置
nginx.conf 负载均衡的基本配置内容如下,以轮询策略为例:
worker_processes 1;events {worker_connections 1024;
}http {# upstream模块:server_group_name 自定义服务组名upstream server_group_name {# server指令指定后端服务器的IP地址和端口server localhost:8080;server 192.168.xxx.xxx:8081 down;server 192.168.xxx.xxx:8082 max_fails=3 fail_timeout=20s;server 192.168.xxx.xxx:8083;}# server模块server {listen 80;server_name localhost;location / {# proxy_pass:代理转发,将单体服务http://127.0.0.1:80,改为服务组名proxy_pass http://server_group_name/;# proxy_redirect default;}}
}
二、Nginx负载均衡实战
浏览效果:在浏览器访问:http://192.168.xxx.xxx/test.html时,由于配置的负载均衡会将请求平均分发到两台服务器中,访问时会出现不同界面。。
1、准备工作
这里准备两台tomcat服务器,一台服务器的端口为8080,另一台服务器的端口为8080;
在这两台tomcat服务器的webapps目录中的 ROOT文件夹中创建一个 test.html文件,用于测试。
# 添加 html文件并加入内容
echo "<h1>This is 8080 Port</h1>" > /usr/local/tomcat8080/webapps/ROOT/test.html
echo "<h1>This is 8080 Port -------</h1>" > /usr/local/tomcat8080/webapps/ROOT/test.html
启动两个tomcat服务。
#启动tomcat8080
/usr/local/tomcat8080/bin/startup.sh
浏览器直接访问tomcat服务。
2、Nginx负载均衡配置
第一步:修改Nginx的配置文件
vim /usr/local/nginx/conf/nginx.conf
配置内容如下,以轮询策略为例:
worker_processes 1;events {worker_connections 1024;
}http {# upstream模块:自定义服务组名upstream my_tomcat_server {server 192.168.xxx.1xx:8080;server 192.168.xxx.2xx:8080;}server {listen 80;server_name 192.168.xxx.xxx; # 指定虚拟主机的IP,或者外网域名location / {root html;# proxy_pass:代理转发,指定我们配置负载均衡的服务名my_tomcat_serverproxy_pass http://my_tomcat_server; index index.html index.htm; }}
}
第二步:重启Nginx
修改 nginx完之后,保存退出,重启Nginx。
/usr/local/nginx/sbin/nginx -s reload
# 先执行停止命令再执行启动命令
[root@centos7 sbin]# /usr/local/nginx/sbin/nginx -s quit
[root@centos7 sbin]# /usr/local/nginx/sbin/nginx
第三步:浏览器访问OK
在浏览器访问:http://192.168.xxx.xxx/test.html时,由于配置的负载均衡会将请求平均分发到到这两台服务器中,所以,访问时会出现不同界面。
第四步:关闭服务
#关闭Nginx
/usr/local/nginx/sbin/nginx -s quit
#关闭tomcat
/usr/local/tomcat8080/bin/shutdown.sh
/usr/local/tomcat8080/bin/shutdown.sh
三、Nginx负载均衡分配策略介绍
1、轮询[默认]
轮询方式是Nginx负载默认的方式。
该策略会使得每个请求按时间顺序逐一分配到不同的后端服务器,如果其中某个后端服务器 down 掉,该策略能自动从轮询列表中剔除该服务。
轮询方式是将所有请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
# upstream模块:自定义服务组名upstream my_tomcat_server {server localhost:8080; # 服务器的ip:portserver 192.168.xxx.xxx:8081;}
2、权重(weight)
该策略会指定每个服务的权重比例,权重越高被分配的客户端(请求)也就越多,weight 和访问比率成正比。主要用于后端服务器性能不均的情况。
- weight指定轮询权值,默认值为1。通常用于后端服务机器性能不统一,将性能好的分配权重高来发挥服务器最大性能。
不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
upstream my_tomcat_server {server localhost:8080 weight=2;server 192.168.xxx.xxx weight=5; # 权重设置为5,5>2,所以请求时会多跳转到这个服务}
3、ip_hash(哈希)
该策略会按照每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器。有效解决了动态网页存在的session共享问题。
源地址哈希法:根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
注意:
ip_hash和 weight也可以配合使用。
upstream my_tomcat_server {ip_hash;server localhost:8080;server 192.168.xxx.xxx; }
# ip_hash和 weight也可以配合使用upstream my_tomcat_server {ip_hash;server localhost:8080 weight=1;server 192.168.xxx.xxx weight=2;}
4、最少连接(least_conn)
该策略会将请求分配到连接数最少的服务上。
upstream my_tomcat_server {least_conn;server localhost:8080;server 192.168.xxx.xxx; }
5、第三方策略
Nginx支持集成第三方的策略插件。
比如:
- fair:此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,即响应时间短的优先分配。比上面更加智能的负载均衡算法。下载安装 Nginx的upstream_fair模块。
- url_hash:按访问 url的 hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。下载安装 Nginx 的hash软件包。
– 求知若饥,虚心若愚。
相关文章:

Nginx负载均衡详解
一、负载均衡介绍 1、负载均衡的定义 单体服务器解决不了并发量大的请求,所以,我们可以横向增加服务器的数量(集群),然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多…...

基于Spring Boot的宠物咖啡馆平台的设计与实现
目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 看护师信息管理 宠物寄养管理 健康状况管理 点单 宠物体验 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已…...
TYVJ P1026 犁田机器人
描述 Farmer John為了让自己从无穷无尽的犁田工作中解放出来,於是买了个新机器人帮助他犁田。这个机器人可以完成犁田的任务,可惜有一个小小的缺点:这个犁田机器人一次只能犁一个边的长度是整数的长方形的田地。 因為FJ的田地有树和其他障碍…...

软件测试面试经验分享,真实面试题
前言 本人普通本科计算机专业,做测试也有3年的时间了,讲下我的经历,我刚毕业就进了一个小自研薪资还不错,有10.5k(个人觉得我很优秀),在里面呆了两年,积累了一些的经验和技能&#…...

计算机网络 - 链路层
计算机网络 - 链路层 计算机网络 - 链路层 基本问题 1. 封装成帧2. 透明传输3. 差错检测 信道分类 1. 广播信道2. 点对点信道 信道复用技术 1. 频分复用2. 时分复用3. 统计时分复用4. 波分复用5. 码分复用 CSMA/CD 协议PPP 协议MAC 地址局域网以太网交换机虚拟局域网 基本问题…...

5.wifi开发【智能家居:上】,开发准备:智能开关灯,智能采集温湿,智能调彩灯
一。wifi智能家居项目开发 【开发准备1】:继电器控制开发 1.智能开关 器件准备:wifi(esp8266,使用CP2102)继电器 结果: 2.继电器工作原理 (1)继电器是一种自动电气开关 ÿ…...

26523-2022 精制硫酸钴 随笔练习
声明 本文是学习GB-T 26523-2022 精制硫酸钴. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了精制硫酸钴的要求、试验方法、检验规则、标志、标签、包装、运输和贮存。 本文件适用于精制硫酸钴。 注:该产品主要用于…...

企业该如何选择数字化转型工具?_光点科技
随着科技的不断进步和数字化的浪潮席卷全球,企业数字化转型已经成为了保持竞争力和持续增长的关键因素之一。无论企业规模大小,数字化转型都可以提高效率、降低成本、改善客户体验,从而实现更好的业务结果。然而,要成功进行数字化…...

算法与数据结构-Trie树
文章目录 什么是“Trie 树”?如何实现一棵 Trie 树?Trie 树真的很耗内存吗?Trie 树与散列表、红黑树的比较 什么是“Trie 树”? Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符…...
语音助手开发小记(2023.9.25)
通道问题 在使用函数swr_alloc_set_opts给SwrContext传递输入输出的音频参数时,需要设置通道,这里通道为2,但是通道布局不能传递2.比如AV_CH_LAYOUT_STEREO 实际值为3 如果要计算通道布局的通道数使用函数av_get_channel_layout_nb_channels…...

FastestDet---模型训练
代码:https://github.com/dog-qiuqiu/FastestDet 一、构造数据集 数据集格式YOLO相同,每张图片对应一个txt标签文件。标签格式:“category cx cy wh”,category为类别id,cx, cy为归一化标签框中心点的坐标,w, h为归一化标签框的宽度和高度, .txt标签文件内容示例如下: 0…...

基于SpringBoot的医院管理系统
目录 前言 一、技术栈 二、系统功能介绍 病床信息管理 药房信息管理 个人中心管理 药房信息 病床类别 科室信息管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息互联网信息的飞速发展,医院也在创建着属于自己的管理系统。本文介…...
java图片转pdf ,pdf 导出
pom引入jar <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.0-RC2</version></dependency> 转pdf方法 /*** 使用pdfbox将jpg转成pdf** throws IOException IOException*/pu…...

掌握Go的运行时:从编译到执行
目录 一、Go运行编译简介Go语言的目标和设计哲学运行时环境编译过程小结 二、执行环境操作系统与硬件层系统调用(Syscalls)虚拟内存 Go运行时(Runtime)Goroutine调度器内存管理和垃圾收集网络I/O代码示例:Go运行时调度…...

打造香港最安全便捷的银行,众安银行发布首份技术白皮书
作者:林海宾&李龙 作为香港金融科技的代表,香港虚拟银行通过科技驱动,为客户提供了安全、便捷、普惠的金融服务。在八间持牌的虚拟银行中,众安银行目前在用户数量、存款、资产和收入规模上均处于领先水平。最快120秒线上开户…...

Spring实现简单的Bean容器
1.BeanDefinition,用于定义 Bean 实例化信息,现在的实现是以一个 Object 存放对象 public class BeanDefinition {/*** bean对象*/private Object bean;/*** 存放 (定义)Bean 对象*/public BeanDefinition(Object bean) {this.bea…...
Python15题day13
③continue的好处 break是跳出循环体,continue是跳过continue语句后面的代码块,循环并不停止 题目要求: 使用input函数接受用户的输入,如果用户输入的数值小于等于10,则判断是奇数还是偶数如果数值大于10,则输出“输入…...

聊聊并发编程——多线程之AQS
目录 队列同步器(AQS) 独占锁示例 AQS之同步队列结构 解析AQS实现 队列同步器(AQS) 队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组 件的基础框架&…...

DE0开发板交通灯十字路口红绿灯VHDL
名称:基于DE0开发板的交通灯十字路口红绿灯 软件:Quartus 语言:VHDL 要求: 设计一个十字路口交通信号灯的控制电路。分为两种情况,正常状态和报警状态。 1.正常状态:要求红、绿灯按一定的规律亮和灭&a…...

华为云云耀云服务器L实例评测使用 | 通过程序实现直播流自动分段录制
华为云云耀云服务器L实例评测使用 | 通过程序实现直播流自动分段录制 1. 准备工作2. 环境搭建3. 心得总结 1. 准备工作 随着云计算时代的进一步深入,越来越多的中小企业企业与开发者需要一款简单易用、高能高效的云计算基础设施产品来支撑自身业务运营和创新开发。基…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...