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

07. Nginx进阶-Nginx负载均衡

简介

负载均衡

什么是负载均衡?

负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行。

Nginx负载均衡

什么是Nginx负载均衡?

Nginx负载均衡可以大大提升系统的吞吐率、请求性能、容灾性能。

工作原理

web服务器直接面向用户时,往往要承载大量并发请求。
单台服务器难以负荷,此时使用多天web服务器组成集群,前端使用Nginx负载均衡将请求分散到后端web服务器集群中。

示意图

应用

主机规划

主机名称主机地址主机功能
master-1192.168.131.129负载均衡主机
master-2192.168.131.130web主机1
master-3192.168.131.131web主机2

环境准备

安装Nginx

三台主机一同安装Nginx服务

  • 配置yum仓库
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
  • 安装Nginx
yum list | grep nginx
yum -y install nginx
nginx -v

配置web主机

  • 配置web站点

地址:192.168.131.130、192.168.131.131
路径:/etc/nginx/conf.d/default.conf

server {listen       80;server_name  wang.mingqu.com;charset utf-8;location / {root   /www/wangmingqu/;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}}
  • 配置web页面

地址:192.168.131.130、192.168.131.131
路径:/www/wangmingqu/index.html

#主机:192.168.131.130、192.168.131.131
mkdir -p /www/wangmingqu/#主机:192.168.131.130
echo "王茗渠测试页面,主机IP:192.168.131.130" > /www/wangmingqu/index.html#主机:192.168.131.131
echo "王茗渠测试页面,主机IP:192.168.131.131" > /www/wangmingqu/index.html

注意:生成环境中两台web主机的资源内容需要保持一致,此处是为了演示负载均衡分配到了两台机器上

  • 启动web服务
systemctl stop firewalld
setenforce 0
nginx -t
systemctl start nginx
curl -iv  wang.mingqu.com

简单应用

配置负载均衡

地址:192.168.131.129
路径:/etc/nginx/conf.d/wangmingqu.conf

upstream web {server 192.168.131.130;server 192.168.131.131;
}server {listen 80;server_name wang.wangmingqu.com;charset utf-8;location / {proxy_pass http://web; }  }

检查配置

nginx -t
systemctl reload nginx

验证负载均衡

image.png
image.png

配置参数

upstream

语法:upstream name {…}
作用:定义一个负载均衡主机组
适用范围:http

server

语法:server url|host;
作用:定义负载均衡主机组中的主机
适用范围:upstream

proxy_pass

语法:proxy_pass http://name;
作用:引用定义的负载均衡主机组,将客户端请求转发至upstream服务池。
适用范围:location

后端状态

  1. weight

语法:server url|host weight=数值;
作用:指定负载均衡主机组中的主机权重,将客户端请求优先发送到该主机。
适用范围:upstream

  1. down

语法:server url|host down;
作用:指定当前主机暂时不参与负载均衡。
适用范围:upstream

  1. backup

语法:server url|host backup;
作用:指定负载均衡主机组中的某个主机为备份主机。
适用范围:upstream

  1. max_fails

语法:server url|host max_fails=数值;
作用:允许请求失败的次数
适用范围:upstream

  1. fail_timeout

语法:server url|host max_fails=数值 fail_timeout=时间s;
作用:经过max_fails失败后,服务暂停时间,单位秒“s”
适用范围:upstream

  1. max_conns

语法:server url|host max_conns=数值;
作用:限制最大的请求连接数。
适用范围:upstream

算法详解

轮询算法

  1. 简介

按时间顺序逐一分配到不同的后端服务器(默认算法),简称rr。
不考虑实际负载或配置,平均分配客户端请求。

  1. 应用
upstream web {server 192.168.131.130;server 192.168.131.131;
}server {listen 80;server_name wang.wangmingqu.com;charset utf-8;location / {proxy_pass http://web; }  }

权重算法

  1. 简介

权重算法,设置的weight值越大,请求访问到该机器的概率越高。又称为加权轮询,简称wrr。

  1. 应用
upstream web {server 192.168.131.130 weight=10;server 192.168.131.131;
}server {listen 80;server_name wang.wangmingqu.com;charset utf-8;location / {proxy_pass http://web; }  }

IP哈希算法

  1. 简介

每个请求按访问IP的hash结果分配。
这样来自同一IP的固定客户端访问同一个后端服务器。
注意:不能和weight一起使用。

  1. 应用
upstream web {ip_hash;server 192.168.131.130;server 192.168.131.131;
}server {listen 80;server_name wang.wangmingqu.com;charset utf-8;location / {proxy_pass http://web; }  }

URL哈希算法

  1. 简介

每个请求按访问URL的hash结果分配。
每个相同的URL定向到同一个后端服务器。

  1. 应用
upstream web {hash $request_uri;server 192.168.131.130;server 192.168.131.131;
}server {listen 80;server_name wang.wangmingqu.com;charset utf-8;location / {proxy_pass http://web; }  }

最少连接数算法

  1. 简介

最少连接数算法,哪台机器的链接数少就分发到这台机器上,简称lc。

  1. 应用
upstream web {least_conn;server 192.168.131.130;server 192.168.131.131;
}server {listen 80;server_name wang.wangmingqu.com;charset utf-8;location / {proxy_pass http://web; }  }

加权最少连接数算法

  1. 简介

加权最少连接数算法,就是weight和least_conn两个算法的集合,简称wlc。

  1. 应用
upstream web {least_conn;server 192.168.131.130 weight=5;server 192.168.131.131;
}server {listen 80;server_name wang.wangmingqu.com;charset utf-8;location / {proxy_pass http://web; }  }

七层负载&四层负载

七层负载

七层负载均衡简介

什么是Nginx七层负载均衡?

七层负载均衡是在应用层,可以完成很多应用方面的协议请求。
比如http应用的负载均衡,可以实现http信息的改写、头信息的改写、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等等的规则。
所以在应用层的服务里面,可以做的内容就更多,Nginx是一个典型的七层负载均衡。

七层负载均衡应用场景

可以将请求分发到不同的服务上,并且可以根据请求信息进行灵活的代理转发;
由于请求会通过负载均衡服务器,负载均衡服务器会过滤一些请求(例如:DOS攻击)避免所有请求信息都打到服务器上,保障了服务器的稳定运行。
处于网络分层的最上层,需要对数据进行解析,与客户端建立连接,效率比较低。

配置web主机

  • 配置web站点

地址:192.168.131.130、192.168.131.131
路径:/etc/nginx/conf.d/default.conf

server {listen       80;server_name  wang.mingqu.com;charset utf-8;location / {root   /www/wangmingqu/;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}}
  • 配置web页面

地址:192.168.131.130、192.168.131.131
路径:/www/wangmingqu/index.html

#主机:192.168.131.130、192.168.131.131
mkdir -p /www/wangmingqu/#主机:192.168.131.130
echo "王茗渠测试页面,主机IP:192.168.131.130" > /www/wangmingqu/index.html#主机:192.168.131.131
echo "王茗渠测试页面,主机IP:192.168.131.131" > /www/wangmingqu/index.html

注意:生成环境中两台web主机的资源内容需要保持一致,此处是为了演示负载均衡分配到了两台机器上

  • 启动web服务
systemctl stop firewalld
setenforce 0
nginx -t
systemctl start nginx
curl -iv  wang.mingqu.com

配置负载均衡

地址:192.168.131.129
路径:/etc/nginx/conf.d/wangmingqu.conf

upstream web {server 192.168.131.130;server 192.168.131.131;
}server {listen 80;server_name wang.wangmingqu.com;charset utf-8;location / {proxy_pass http://web; }  }

检查配置

nginx -t
systemctl reload nginx

验证负载均衡

image.png
image.png

四层负载

四层负载均衡简介

什么是Nginx四层负载均衡?

四层负载均衡是基于传输层协议包来封装的(如:TCP/IP),那我们前面使用到的七层是指的应用层,他的组装在四层的基础之上,无论四层还是七层都是指的OSI网络模型。

四层负载均衡应用场景
  1. 四层+七层来做负载均衡,四层可以保证七层的负载均衡的高可用性;如:nginx就无法保证自己的服务高可用,需要依赖LVS或者keepalive。
  2. 如:tcp协议的负载均衡,有些请求是TCP协议的(mysql、ssh),或者说这些请求只需要使用四层进行端口的转发就可以了,所以使用四层负载均衡。
四层负载均衡总结
  1. 四层负载均衡仅能转发TCP/IP协议、UDP协议、通常用来转发端口,如:tcp/22、udp/53;
  2. 四层负载均衡可以用来解决七层负载均衡端口限制问题;(七层负载均衡最大使用65535个端口号)
  3. 四层负载均衡可以解决七层负载均衡高可用问题;(多台后端七层负载均衡能同时的使用)
  4. 四层的转发效率比七层的高得多,但仅支持tcp/ip协议,不支持http和https协议;
  5. 通常大并发场景通常会选择使用在七层负载前面增加四层负载均衡;

添加四层负载模块

查看四层负载均衡模块
/usr/local/nginx/sbin/nginx -V 2>&1 | grep stream
安装四层负载均衡模块
cd /usr/local/nginx/conf/
./configure --prefix=/usr/local/nginx \
--user=nginx --group=nginx \
--with-http_realip_module \
--with-http_v2_module \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-stream \
--with-stream_ssl_module \
--with-http_sub_module \
--with-http_random_index_module

创建配置文件

mkdir -p /usr/local/nginx/conf/conf.stream/

主配置文件

路径:/usr/local/nginx/conf/nginx.conf
主机地址:192.168.131.129

user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}include /usr/local/nginx/conf/conf.stream/*.conf;http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;keepalive_timeout  65;#gzip  on;include /usr/local/nginx/conf/conf.d/*.conf;
}

子配置文件

路径:/usr/local/nginx/conf/conf.d/stream.conf
主机地址:192.168.131.129

stream {upstream web_test_01 {server 192.168.131.130:22;}upstream web_test_02 {server 192.168.131.131:22;}server {listen 8081;proxy_connect_timeout 1s;proxy_timeout 3s;proxy_pass web_test_01;}server {listen 8082;proxy_connect_timeout 1s;proxy_timeout 3s;proxy_pass web_test_02;}
}

验证四层负载

  1. 检查配置文件
/usr/local/nginx/sbin/nginx -t
systemctl reload nginx
  1. 验证四层负载
ssh -p 8081 root@192.168.131.129
ssh -p 8082 root@192.168.131.129

image.png
image.png

相关文章:

07. Nginx进阶-Nginx负载均衡

简介 负载均衡 什么是负载均衡&#xff1f; 负载均衡&#xff0c;英文名称为Load Balance&#xff0c;其含义就是指将负载&#xff08;工作任务&#xff09;进行平衡、分摊到多个操作单元上进行运行。 Nginx负载均衡 什么是Nginx负载均衡&#xff1f; Nginx负载均衡可以大…...

windows/linux下其他位置调用指定nodejs脚本报错Error: Cannot find module ‘esm’

问题&#xff1a; 有一个nodejs脚本名为html2word,同目录下还有它对应的package.json&#xff0c;正常在html2word所在目录下执行脚本没问题&#xff0c;但是在其他目录执行时报错&#xff1a;Error: Cannot find module ‘esm’ 原因&#xff1a; 在其他位置执行node脚本时…...

2024-03-05 linux 分区老显示满,Use 100%,原因是SquashFS 是一种只读文件系统,它在创建时就已经被填满,所有空间都被使用。

一、这两天一直纠结一个问题&#xff0c;无论怎么修改&#xff0c;linux 分区老显示满&#xff0c;Use 100%&#xff0c;全部沾满。如下图的oem分区。 二、导致出现上面的原因是&#xff1a;SquashFS文件系统里的空间利用率总是显示为100%。 三、SDK里面也说明SquashFS文件系统…...

蓝桥杯倒计时 41天 - KMP 算法

KMP算法 KMP算法是一种字符串匹配算法&#xff0c;用于匹配模式串P在文本串S中出现的所有位置。 例如S“ababac&#xff0c;P“aba”&#xff0c;那么出现的所有位置是13。 在初学KMP时&#xff0c;我们只需要记住和学会使用模板即可&#xff0c;对其原理只需简单理解&#xff…...

《汇编语言》- 读书笔记 - 第13章-int 指令

《汇编语言》- 读书笔记 - 第13章-int 指令 13.1 int 指令13.2 编写供应用程序调用的中断例程中断例程&#xff1a;求一 word 型数据的平方主程序中断处理程序执行效果 中断例程&#xff1a;将一个全是字母&#xff0c;以0结尾的字符串&#xff0c;转化为大写主程序中断处理程序…...

深入了解 Golang 条件语句:if、else、else if 和嵌套 if 的实用示例

条件语句 用于根据不同的条件执行不同的操作。Go中的条件可以是真或假。Go支持数学中常见的比较运算符&#xff1a; 小于 < 小于等于 < 大于 > 大于等于 > 等于 不等于 ! 此外&#xff0c;Go还支持常见的逻辑运算符&#xff1a; 逻辑与 && 逻辑或…...

大数据和机器学习在气象预报中的应用-张平文院士

报告链接&#xff1a;张平文院士 -- 大数据和机器学习在气象预报中的应用_哔哩哔哩_bilibili...

C#高级:Winform桌面开发中DataGridView的详解

一、每条数据增加一个按钮&#xff0c;点击输出对应实体 请先确保正确添加实体的名称和文本&#xff1a; private void button6_Click(object sender, EventArgs e) {//SQL查询到数据&#xff0c;存于list中List<InforMessage> list bll.QueryInforMessage();//含有字段…...

java八股文复习-----2024/03/05----基础---反射,动态代理。序列化

来源一 大彬八股文 来源二 2023 20W字八股文 2024秋招八股文 1.Java创建对象有几种方式&#xff1f; Java创建对象有以下几种方式&#xff1a; 用new语句创建对象。使用反射&#xff0c;使用Class.newInstance()创建对象。调用对象的clone()方法。运用反序列化手段&#x…...

【人工智能】Anthropic发布强大的Claude3对齐GPT-4,大模型杂谈个人感想

北京时间3月5日&#xff0c;人工智能创业公司Anthropic宣布&#xff0c;推出其突破性的Claude 3系列模型。Claude 3系列包含三个子模型&#xff0c;分别为Claude 3 Haiku、Claude 3 Sonnet和Claude 3 Opus&#xff0c;它们提供不同程度的智能、速度和成本选择&#xff0c;以满足…...

基于openKylin与RISC-V的MindSpore AI项目实践

项目目标&#xff1a; 在openKylin系统上安装和配置MindSpore框架。开发一个简单的图像分类模型&#xff0c;并在RISC-V平台上进行训练和推理。根据RISC-V的特性&#xff0c;对MindSpore框架进行必要的优化。 目录 项目目标&#xff1a; 训练模型 编写训练代码&#xff0c;设…...

【牛客】VL64 时钟切换

描述 题目描述&#xff1a; 存在两个同步的倍频时钟clk0 clk1,已知clk0是clk1的二倍频&#xff0c;现在要设计一个切换电路&#xff0c;sel选择时候进行切换&#xff0c;要求没有毛刺。 信号示意图&#xff1a; 波形示意图&#xff1a; 输入描述&#xff1a; clk0 clk1为时…...

Java设计模式——桥连模式

桥接模式简单来说就是通过将抽象部分和具体部分分离&#xff0c;使它们可以独立地变化。如果你的一个类存在多个变化维度&#xff08;如抽象和具体的实现&#xff09;。若使用继承来处理这些变化&#xff0c;将会导致类层次结构的急剧增加&#xff0c;难以管理和维护。并且&…...

数据结构与算法:堆排序和TOP-K问题

朋友们大家好&#xff0c;本节内容来到堆的应用&#xff1a;堆排序和topk问题 堆排序 1.堆排序的实现1.1排序 2.TOP-K问题3.向上调整建堆与向下调整建堆3.1对比两种方法的时间复杂度 我们在c语言中已经见到过几种排序&#xff0c;冒泡排序&#xff0c;快速排序&#xff08;qsor…...

【NR 定位】3GPP NR Positioning 5G定位标准解读(三)

目录 前言 5 NG-RAN UE定位架构 5.1 架构 5.2 UE定位操作 5.3 NG-RAN定位操作 5.3.1 通用NG-RAN定位操作 5.3.2 OTDOA定位支持 5.3.3 广播辅助信息支持 5.3.4 NR RAT相关定位支持 5.4 NG-RAN中与UE定位相关的元素功能描述 5.4.1 用户设备&#xff08;UE&#xff09; …...

文件操作与IO(3) 文件内容的读写——数据流

目录 一、流的概念 二、字节流代码演示 1、InputStream read方法 第一个没有参数的版本&#xff1a; 第二个带有byte数组的版本&#xff1a; 第三个版本 搭配Scanner的使用 2、OutputStream write方法 第一个版本&#xff1a; 第二个写入整个数组版本&#xff1a; …...

《PyTorch深度学习实践》第十一讲卷积神经网络进阶

一、 1、卷积核超参数选择困难&#xff0c;自动找到卷积的最佳组合。 2、1x1卷积核&#xff0c;不同通道的信息融合。使用1x1卷积核虽然参数量增加了&#xff0c;但是能够显著的降低计算量(operations) 3、Inception Moudel由4个分支组成&#xff0c;要分清哪些是在Init里定义…...

Ansible的playbook的编写和解析

目录 什么是playbook Ansible 的脚本 --- playbook 剧本 实例部署&#xff08;使用playbook安装启动httpd服务&#xff09; 1.编写一个.yaml文件 在主机下载安装http&#xff0c;将配置文件复制到opt目录下 运行playbook 在192.168.17.77主机上查看httpd服务是否成功开启…...

[环境配置]ssh连接报错“kex_exchange_identification: read: Connection reset by peer”

已经被VScode ssh毒死好几次了&#xff0c;都是执行命令意外中断&#xff0c;然后又VSCode里连不上、本机Terminal也连不上了。。。 重启远程服务器&#xff0c;VSCode可以连上了&#xff0c; 系统ssh还是不行&#xff0c;报错“kex_exchange_identification: read: Connecti…...

Mybatis-Plus——04,自动填充时间(新注解)

自动填充&#xff08;新注解&#xff09; 一、数据库添加两个字段二、实体类字段属性上增加注解三、编写填充器四、查看结果4.1 插入结果4.2 修改结果 五、同步修改5.1实体类属性改成 INSERT_UPDATE5.2 在填充器的方法这里加上 updateTime5.3 查看结果————————创作不易…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

React核心概念:State是什么?如何用useState管理组件自己的数据?

系列回顾&#xff1a; 在上一篇《React入门第一步》中&#xff0c;我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目&#xff0c;并修改了App.jsx组件&#xff0c;让页面显示出我们想要的文字。但是&#xff0c;那个页面是“死”的&#xff0c;它只是静态…...

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题&#xff0c;从一个接口人不断溯源到另一个 接口人。有时候&#xff0c;不知道是谁的责任填。将工作内容分的很细&#xff0c;每个人负责其中的一小块。我清楚的意识到&#xff0c;自己就是个可以随时替换的螺丝钉&…...