五、企业级架构之Nginx负载均衡

一、负载均衡技术

1、介绍:

负载均衡技术(Load Balance)是一种概念,其原理就是把分发流量、请求到不同的服务器,平均分配用户请求。

2、作用:

流量分发,请求平均,提高系统处理能力,降低单例压力。

安全,隐藏后端真实服务。

屏蔽非法请求。(七层负载均衡)

3、负载均衡分类:

二层负载均衡 (mac):二层负载均衡主要工作在网络的数据链路层,它通过虚拟MAC地址的方式实现。当外部请求到达时,负载均衡器接收这些请求,替换请求的目标MAC地址为实际服务器的MAC地址。

三层负载均衡 (ip):三层负载均衡工作在网络层,外部请求首先发送到虚拟IP地址,负载均衡器接收这些请求后,根据一定的算法(如轮询、权重等)选择一个后端服务器,并将请求的目标IP地址替换为所选服务器的实际IP地址。

四层负载均衡 (tcp):四层负载均衡在三层的基础上增加了对传输层(TCP/UDP)信息的处理。它不仅根据IP地址进行转发,还考虑端口号。当请求到达时,负载均衡器会根据请求的IP地址和端口号来选择后端服务器,并转发请求。

七层负载均衡 (http):七层负载均衡也称为应用层负载均衡,它工作在OSI模型的最高层——应用层。它不仅能够根据IP地址和端口号进行转发,还能解析应用层协议(如HTTP)的内容,并根据协议中的特定信息(如URL、Cookie等)来选择后端服务器。

4、四层与七层负载的区别:

(1) 四层负载均衡:

四层负载均衡根据报文中的目标地址和端口信息来选择后端服务器。当负载均衡设备接收到客户端的SYN请求时,它会根据预设的算法(如轮询、最少连接数等)选择一个最佳的服务器,并修改报文中的目标IP地址,将请求转发给该服务器。

在四层负载中,负载均衡设备只是起到一个类似路由器的转发动作,TCP的三次握手是客户端和服务器直接建立的。

(2) 七层负载均衡:

又称为“内容交换”,也就是通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。例如对图片类的请求转发到特定的图片服务器;将对文字类的请求可以转发到特定的文字服务器。

在七层负载中,负载均衡设备更类似于一个代理服务器,负载均衡和前端的客户端以及后端的服务器都会分别建立TCP连接。

二、负载均衡器LB配置

1、停止web01/web02中的keepalived服务:

负载均衡器LB自带故障转移功能,当某个服务器出现故障时,负载均衡器能够自动将流量转移到其他健康的服务器上。因此不需要在web服务器上再配置keepalived。

2、准备负载均衡器LB:

克隆负载虚拟机LB,修改IP、UUID、hosts,关闭防火墙、selinux和NetworkManager

三、nginx负载均衡实现

1、把www.shop.com域名解析到LB:

2、在LB上编译安装Nginx:

(1) 安装依赖库和环境:

yum -y install pcre-devel zlib-devel openssl-devel

yum -y install gcc gcc-c++ autoconf automake make

(2) 编译安装nginx:

tar -zxf nginx-1.16.0.tar.gz
cd nginx-1.16.0
useradd -r -s /sbin/nologin www
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module
make && make install
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

3、nginx负载均衡配置:

upstream shop {
    server 10.1.1.11;  
    server 10.1.1.13;
}

server {  
    listen 80;
    server_name www.shop.com;

    location / {
        proxy_pass http://shop;
        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

(1) 负载配置:

① upstream shop:定义了一个名为 shop 的后端服务器组,其中包含了两台服务器 web01 和 web02。

② server_name www.shop.com:指定服务器接受的请求针对的是域名www.shop.com。

③ proxy_pass http://shop:http://shop 是一个代理传递的目标,代理服务器将客户端的请求传递给shop组中定义的服务器,http://10.1.1.11

④ proxy_set_header HOST $host:代理服务器将原始请求中的Host请求头保留并传递给后端服务器。后端应用程序(如PHP)依赖Host请求头来确定如何响应请求,如果没有正确的Host请求头,后端应用程序可能无法正确运行。

完成了上述配置就已实现了负载均衡。

检验负载均衡效果:

vim /home/www/public/index.php

echo "web01"; / echo "web02";

(2) 获取客户端真实IP地址:

当查看web服务器的日志时,发现只能获取到代理服务器的访问信息。这是因为真实客户端请求通过代理服务器转发至后端服务器,因此后端服务器认为请求都是由代理服务器发出的。

① 修改LB配置:

想要后端服务器能够获取到真实的客户端IP地址,需要在LB的nginx配置文件中添加如下两条配置:

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

② web01、web02修改日志格式:

http {
    ……
    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 logs/access.log main;
    ……
}

access_log logs/access.log main:指定访问日志的位置

"$http_x_forwarded_for":获取负载均衡转发前的IP

查看日志:

4、负载均衡与反向代理的区别:

负载均衡(Load Balancing)的主要目的是根据不同的算法,在多个服务器之间分配工作负载,以确保每个服务器都能够有效地处理请求,提高整体系统的性能和可用性。

反向代理(Reverse Proxy)则位于客户端和服务器之间,客户端向反向代理发送请求,然后反向代理将请求转发给后端的服务器,反向代理可以用来隐藏服务器的真实信息。

5、分发请求关键字:

upstream中的分发之后有几个关键字:

backup:备用,当upstream中定义的其他服务器都不可用时,才会将请求分发至此服务器。

down:标记为down的服务器不会被用来处理任何请求,通常用于将某个已经出现故障的服务器从负载均衡中移除。

upstream {
    server 10.1.1.10 backup或down;
    server 10.1.1.12;
}

6、nginx 负载均衡算法:

① round robin轮询方式,默认的负载均衡方式,依次将请求分配到各个后台服务器中,适用于后台机器性能一致的情况。

② weight:根据权重来分发请求到不同的机器中,指定轮询几率,用于后端服务器性能不均的情况。

upstream {
    server 10.1.1.10 weight=8;
    server 10.1.1.12 weight=2;
}

③ IP_hash:根据请求者ip的hash值将请求发送到后台服务器中,可以保证来自同一ip的请求被分配固定的机器上。

upstream {
    ip_hash;
    server 10.1.1.10;
    server 10.1.1.12;
}

6、session持久性:

(1) cookies 与 session:

Cookies和Session是Web中常用的两种状态管理机制,用于跟踪用户会话和存储用户信息。

① Cookies存储在客户端上,Cookies可以设置过期时间,过期后自动删除,也可以选择不过期,由用户手动清除。

② Session通常存储在服务器上。Session的生命周期通常与用户的浏览器会话相关联,当用户关闭浏览器或会话超时后,Session会失效。

(2) 负载均衡出现的问题:

当负载均衡配置了轮询算法后,可能会出现验证码登录失败的问题。这是因为用户在一台服务器上输入了验证码,但随后的请求被负载均衡器路由到了另一台服务器,导致会话信息不同步,从而引发登录失败。

(3) 解决方案:

通过ip_hash算法,将生成验证码和验证都请求同一台服务器,实现session会话持久性。

upstream shop {
    ip_hash;
    server 10.1.1.11;
    server 10.1.1.13;
}

sbin/nginx -s reload

配置完成后即可成功登录:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SQL Server的详细使用教程】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

Free MyBatis Tool插件的进阶使用指南(消灭dao层的繁琐编码)

目录 零、起因一、怎么使用Free MyBatis Tool插件?1 基本使用2 进阶使用(搞清楚Options的用法)2.1 概览2.2 详述2.2.0 Options(一项都不勾选)2.2.1 Use-Lombok【消除UserDO中的getter和setter代码】2.2.2 Comment&…

《QT实用小工具·十二》邮件批量发送工具

1、概述 源码放在文章末尾 该项目实现了邮件的批量发送&#xff0c;如下图所示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef SMTPCLIENT_H #define SMTPCLIENT_H#include <QtGui> #include <QtNetwork> #if (QT_VERSION > QT_VERSION_CHECK(5,0,…

.kat6.l6st6r勒索病毒肆虐,这些应对策略或许能帮到你

引言&#xff1a; 近年来&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒更是成为了公众关注的焦点。其中&#xff0c;.kat6.l6st6r勒索病毒以其独特的传播方式和破坏力&#xff0c;给全球用户带来了极大的困扰。本文将深入探讨.kat6.l6st6r勒索病毒的特点&#xf…

DIY蓝牙键盘(1) - 理解 键盘报文(免费)

DIY蓝牙键盘(1) - 理解键盘报文 1. 键盘报文体验 一个键盘对于用户的体验是&#xff0c;用户按按键A他能看到字母A会在主机上显示出来。那这是如何实现的&#xff1f; 其实很简单&#xff0c;只要键盘发送下面的两个报文给主机&#xff0c;字母A就能在主机上显示出来。 (1)…

深入理解C/C++的内存管理

在C和C中&#xff0c;高效的内存管理是编写性能优化和资源高效利用程序的关键。本文将深入探讨C/C内存管理的各个方面&#xff0c;包括内存的分布、C语言和C中的动态内存管理方式&#xff0c;以及new和delete操作符的使用 C/C内存分布 C和C程序的内存可以分为以下几个区域&…

MySQL安装卸载-合

目录 1.Linux下安装 1.1下载 1.2.上传 ​​​​​​​1.3.解压 ​​​​​​​1.4.安装 ​​​​​​​1.5.启动服务 ​​​​​​​1.6.查询临时密码 ​​​​​​​1.7.修改临时密码 ​​​​​​​1.8.创建用户 ​​​​​​​1.9.分配权限 ​​​​​​​1.10.重…

00-JAVA基础-脚本引擎

JAVA脚本引擎 什么是JAVA脚本引擎 Java 平台自带了如JavaScript、Groovy等脚本语言的引擎&#xff0c;可以在运行时动态地加载和执行脚本代码。这些脚本引擎可以直接在Java应用程序中使用&#xff0c;例如&#xff0c;通过ScriptEngineManager来获取特定脚本语言的ScriptEngi…

第18讲:数据在内存中的存储

⽬录 1. 整数在内存中的存储 2. ⼤⼩端字节序和字节序判断 3. 浮点数在内存中的存储 ——————————————————————————————————————————— 1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#x…

如何保持数据一致性

如何保持数据一致性 数据库和缓存&#xff08;比如&#xff1a;redis&#xff09;双写数据一致性问题&#xff0c;是一个跟开发语言无关的公共问题。尤其在高并发的场景下&#xff0c;这个问题变得更加严重。 问题描述&#xff1a; 1.在高并发的场景中&#xff0c;针对同一个…

VC++建立空文档失败的一种情形

假设现在要在单文档程序的客户区创建控件; 把控件作为视类的成员变量; 先把成员变量定义加到视类头文件; 然后在视类的, BOOL CMyttView::PreCreateWindow(CREATESTRUCT& cs) {....... } 在此成员函数中创建控件; 运行程序,就会出现如下错误, 这就需要在类向导…

《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》

《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》 2022-05-17 11:06 先看下带透明的特效素材效果1、首先在项目设置里搜索alpha&#xff0c;在后期处理标签设置最后一项allow through tonemapper2、在插件管理器中&#xff0c;搜索movie render &#xff0c;加载movie render q…

《QT实用小工具·十一》Echart图表JS交互之仪表盘

1、概述 源码放在文章末尾 该项目为Echart图表JS交互之炫酷的仪表盘&#xff0c;可以用鼠标实时改变仪表盘的读数。 下面为demo演示&#xff1a; 该项目部分代码如下&#xff1a; #include "widget.h" #include "ui_widget.h" #include "qurl.h&q…

UE小:UE5.3无法创建C++工程

当您在使用Unreal Engine (UE) 构建项目时&#xff0c;如果遇到以下问题&#xff1a; Running C:/Program Files/Epic Games/UE\_5.3/Engine/Build/BatchFiles/Build.bat -projectfiles -project"C:/UEProject/Shp\_1/Shp\_1.uproject" -game -rocket -progress Usi…

Vuex的模块化管理

1&#xff1a;定义一个单独的模块。由于mutation的第二个参数只能提交一个对象&#xff0c;所以这里的ThisLog是个json串。 2&#xff1a;在Vuex中的Store.js中引入该模块 3&#xff1a;在别的组件中通过...mapState调用模块保存的State的值。 4&#xff1a;用...mapMutations修…

界面控件Kendo UI for jQuery 2024 Q1亮点 - 新的ToggleButton组件

Telerik & Kendo UI 2024 Q1 版本于2024年初发布&#xff0c;在此版本中将AI集成到了UI组件中&#xff0c;在整个产品组合中引入AI Prompt组件以及10多个新的UI控件、支持Angular 17、多个数据可视化功能增强等。 P.S&#xff1a;Kendo UI for jQuery提供了在短时间内构建…

递归算法解读

递归&#xff08;Recursion&#xff09;是计算机科学中的一个重要概念&#xff0c;它指的是一个函数&#xff08;或过程&#xff09;在其定义中直接或间接地调用自身。递归函数通过把问题分解为更小的相似子问题来解决原问题&#xff0c;这些更小的子问题也使用相同的解决方案&…

文字超出收起展开功能的实现(vue2)

1.编写展开收起组件 <template><div class"text-clamp"><div class"text" :style"{height}"><span v-if"isVisible" class"btn" click"toggle">{{isExpand ? 收起 : ... 展开}}</spa…

24-Web服务核心功能有哪些,如何实现?

在Go项目开发中&#xff0c;绝大部分情况下&#xff0c;我们是在写能提供某种功能的后端服务&#xff0c;这些功能以RPC API 接口或者RESTful API接口的形式对外提供&#xff0c;能提供这两种API接口的服务也统称为Web服务。 Web服务的核心功能 将这些功能分成了基础功能和高…

day63 单调栈part02

503. 下一个更大元素 II 中等 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更…