Nginx七层负载均衡

1、七层负载均衡介绍

Nginx七层负载均衡是在应用层(HTTP/HTTPS)上进行的,可以根据HTTP请求的具体内容,如URL、Cookie、Header等,来决定将请求转发到哪个后端服务器。这种方式不仅能够均衡服务器的计算负载,还能实现更复杂的路由策略,例如:

  • 会话粘性(Sticky Sessions):确保用户的会话请求始终被定向到同一个后端服务器。

  • 基于内容的路由:根据请求的内容(如URL、头部信息)将请求分发到不同的服务器。

1.1 四层与七层负载均衡的区别

1.1.1 四层负载均衡(Layer 4 Load Balancing)

  • 在传输层(Transport Layer)上进行。

  • 关注网络层面的信息,如源和目标IP地址、端口号等。

  • 根据网络信息决定将数据包转发到哪个服务器。

  • 不深入检查数据包的内容。

  • 主要适用于基于TCP/UDP的流量,如HTTP和HTTPS。

1.1.2 七层负载均衡(Layer 7 Load Balancing)

  • 在应用层(Application Layer)上进行。

  • 深入检查网络流量的内容,如HTTP请求头、URL、Cookie等。

  • 根据流量内容做复杂的路由决策。

  • 可以处理多种应用层协议,不仅限于HTTP。

1.2 七层负载均衡配置

服务器类型IP地址发行版
代理服务器(proxy)192.168.110.31/24Rocky Linux 8
静态地址服务器(static)192.168.110.32/24Rocky Linux 8
默认地址服务器(default)192.168.110.33/24Rocky Linux 8
动态地址服务器(upload)192.168.110.34/24Rocky Linux 8

1.2.1 后端节点配置

1.2.1.1 静态地址服务器(static)
[root@static ~]# mkdir /nginx/static
[root@static ~]# echo "This is static page IP=`hostname -I`" >> /nginx/static/index.html
[root@static ~]# vim /etc/nginx/conf.d/VirtualHost.conf
server {listen 192.168.110.32:80;server_name www.nginx,com;root /nginx;
​location / {index index.html;}
}
​
[root@static ~]# nginx -s reload
[root@static ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@static ~]# curl 192.168.110.32/static/
This is static page IP=192.168.110.32 
1.2.1.2 默认地址服务器(default)
[root@default ~]# mkdir /nginx/default
[root@default ~]# echo "This is default page IP=`hostname -I`" >> /nginx/default/index.html
[root@default ~]# vim /etc/nginx/conf.d/VirtualHost.conf 
server {listen 192.168.110.33:80;server_name www.nginx,com;root /nginx/default;
​location / {index index.html;}
}
​
[root@default ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@default ~]# nginx -s reload
[root@default ~]# curl 192.168.110.33/default/
This is default page IP=192.168.110.33 
1.2.1.3 动态地址服务器(upload)
[root@upload ~]# mkdir /nginx/upload
[root@upload ~]# echo "This is upload page IP=`hostname -I`" >> /nginx/upload/index.html
[root@upload ~]# vim /etc/nginx/conf.d/VirtualHost.conf 
server {listen 192.168.110.34:80;server_name www.nginx,com;root /nginx;
​location / {index index.html;}
}
​
[root@upload ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@upload ~]# nginx -s reload
[root@upload ~]# curl 192.168.110.34/upload/
This is upload page IP=192.168.110.34 

1.2.2 代理服务器配置

[root@proxy ~]# vim /etc/nginx/conf.d/proxy.conf
upstream static_pools {server 192.168.110.32;
}
​
upstream default_pools {server 192.168.110.33;
}
​
upstream upload_pools {server 192.168.110.34;
}
​
server {listen 80;server_name www.nginx.com;
​location /static {proxy_pass http://static_pools;proxy_set_header host $host;proxy_set_header X-Forwarded-For $remote_addr;}
​location /default {proxy_pass http://default_pools;proxy_set_header host $host;proxy_set_header X-Forwarded-For $remote_addr;}
​location /upload {proxy_pass http://upload_pools;proxy_set_header host $host;proxy_set_header X-Forwarded-For $remote_addr;}
}
​
[root@proxy ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@proxy ~]# nginx -s reload

注意:这里location的写法,这里的主要难点就在这。例如:如果站点目录写 root /nginx/ststic; 那最后访问 http://www.nginx.com/static/ 时转发路径就为http://www.nginx.com/static/static。所以写/nginx就行了

1.2.3 客户端测试访问

[root@client ~]# echo '192.168.110.31 www.nginx.com' >> /etc/hosts
[root@client ~]# curl http://www.nginx.com
This is default page IP=192.168.110.33 
[root@client ~]# curl http://www.nginx.com/static/
This is static page IP=192.168.110.32 
[root@client ~]# curl http://www.nginx.com/upload/
This is upload page IP=192.168.110.34 

1.2.4 查看各节点访问日志

[root@static ~]# tail -1 /var/log/nginx/access.log
192.168.110.31 - - [21/Apr/2024:17:07:34 +0800] "GET /static/ HTTP/1.0" 200 39 "-" "curl/7.61.1" "192.168.110.35"
​
[root@default ~]# tail -1 /var/log/nginx/access.log
192.168.110.31 - - [21/Apr/2024:17:07:32 +0800] "GET / HTTP/1.0" 200 40 "-" "curl/7.61.1" "192.168.110.35"
​
[root@upload ~]# tail -1 /var/log/nginx/access.log
192.168.110.31 - - [21/Apr/2024:17:07:36 +0800] "GET /upload/ HTTP/1.0" 200 39 "-" "curl/7.61.1" "192.168.110.35"

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

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

相关文章

基于微信小程序的土地租赁的设计与实现

基于微信小程序的土地租赁的设计与实现 Design and Implementation of Land Leasing Based on WeChat Mini Program 完整下载链接:基于微信小程序的土地租赁的设计与实现 文章目录 基于微信小程序的土地租赁的设计与实现摘要第一章 绪论1.1 研究背景1.2 研究目的1.3 研究内容…

C语言 字符类型

下面 我们来说字符类型 我们来看这个 保险单 金额 和 总额 都可以用数字类型 而性别则需要字符型 字符数据的存储 – ASCI码 字符类型 char 就是专为存储字符(如字母,标点和数字)而设计的类型。 使用单引号包含单个字符或转义字符去表示一个 char 类型的常量。 …

Lua调用函数的方式汇总

在Lua脚本语言中,调用函数是一种基本的操作,它允许代码执行在函数定义中封装的操作。Lua 提供了几种灵活的方式来调用函数,以适应不同的场景和需求。以下是Lua中调用函数的几种常见方式: 1. 基本函数调用 最简单的调用方式是使用…

李沐56_门控循环单元——自学笔记

关注每一个序列 1.不是每个观察值都是同等重要 2.想只记住的观察需要:能关注的机制(更新门 update gate)、能遗忘的机制(重置门 reset gate) !pip install --upgrade d2l0.17.5 #d2l需要更新import torch from tor…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别 一、简单介绍 二、简单进行车牌检测和识别实现原理 …

深入理解Java消息中间件-消息的可靠性

基石:在分布式系统中实现消息的可靠性及其原理 在构建现代的分布式系统时,能否可靠地传递消息是衡量系统成功与否的一个关键。本文章旨在讨论如何实现消息的可靠性及其背后的原理,帮助Java技术架构师和开发者构筑一个稳固的系统。 消息可靠…

关于上传自己本地项目到GitHub的相关命令

https://www.cnblogs.com/nature161/p/15014265.html 根据教程里的来,主要注意这个命令: $ git pull --rebase origin master # 对GitHub的仓库包含了readme.md文件的情况先要执行这个命令再pull 如果你的GitHub是main分支想上传到main分支&#xff0…

Opencv_10_自带颜色表操作

void color_style(Mat& image); Opencv_10_自带颜色表操作: void ColorInvert::color_style(Mat& image) { int colormap[] { COLORMAP_AUTUMN, COLORMAP_BONE , COLORMAP_JET , COLORMAP_WINTER, COLORMAP_RAINBOW , COLOR…

编译器的学习

常用的编译器: GCCVisual CClang(LLVM): Clang 可以被看作是建立在 LLVM 之上的一个项目, 实际上LLVM是clang的后端,clang作为前端前端生成LLVM IR,https://zhuanlan.zhihu.com/p/656699711MSVC &#xff…

Docker常用命令(镜像、容器、网络)

一、镜像 1.1 存出镜像 将镜像保存成为本地文件 格式&#xff1a;docker save -o 存储文件名 存储的镜像docker save -o nginx nginx:latest 1.2 载入镜像 将镜像文件导入到镜像库中 格式&#xff1a;docker load < 存出的文件或docker load -i 存出的文件…

程序猿成长之路之数据挖掘篇——朴素贝叶斯

朴素贝叶斯是数据挖掘分类的基础&#xff0c;本篇文章将介绍一下朴素贝叶斯算法 情景再现 以挑选西瓜为例&#xff0c;西瓜的色泽、瓜蒂、敲响声音、触感、脐部等特征都会影响到西瓜的好坏。那么我们怎么样可以挑选出一个好的西瓜呢&#xff1f; 分析过程 既然挑选西瓜有多个…

Android Studio 报错:AVD Pixel_3a_API_30_x86 is already running

在我的Android Studio和虚拟机运行时&#xff0c;我的电脑不小心关机了&#xff0c;在启动后再次打开Android Studio并运行虚拟机时发现报错。 Error while waiting for device: AVD Pixel_3a_API_30_x86 is already running. If that is not the case, delete the files at C…

c++设计模式之桥接模式(拼接组合)

桥接模式&#xff1a;就是进行拼接组装 应用举例&#xff1a; 1.定义了形状&#xff0c;抽象形状接口&#xff0c;圆&#xff0c;矩形 2.定义了颜色&#xff0c;抽象颜色接口&#xff0c;红色&#xff0c;蓝色 3&#xff0c;怎么桥接&#xff0c;抽象具体形状和具体颜色的组合…

应用部署tomcat的三种方式

由于一直在用springboot框架&#xff0c;集成了tomcat&#xff0c;快忘记如何单独部署tomcat了&#xff0c;以下&#xff0c;记录一下&#xff1a; 部署tomcat有三种方式&#xff1a; 一、方式一&#xff1a;将war包丢进webapps 这是最简单粗暴的方式&#xff1a;将web工程打…

用现成的容器来创建一个镜像,或者说再克隆一个一模一样的容器

前言&#xff1a;我在centos系统中使用docker拉取了一个centos镜像&#xff0c;并用这个镜像创建了一个hadoop容器&#xff0c;但是后面我又需要一个相同版本的hadoop镜像来创建其他容器&#xff08;比如hive容器&#xff09;&#xff0c;但是这个时候docker官网并没有对应版本…

个人投资者如何开通快速通道?

其实我们一直都在说快速通道&#xff0c;那么我们个人投资者如何才能开通快速通道呢&#xff1f; 怎样才能做到打板排序前列&#xff0c;成交速度快&#xff0c;适合高频交易呢&#xff1f; 我们一起来了解下&#xff01; 第一&#xff1a;什么是快速通道&#xff1f; 其实就…

C#基础|对象属性Property基础使用,业务特性

哈喽&#xff0c;你好&#xff0c;我是雷工。 探究OOP中属性的奥秘 认识类的属性&#xff08;Property&#xff09; 01 属性的使用 作用&#xff1a;在面向对象&#xff08;OOP&#xff09;中主要用来封装数据。 要求&#xff1a;一般采用Pascal命名法&#xff08;首字母要…

UDS的3字节故障码

在UDS的规范下面&#xff0c;使用19服务去读取故障码&#xff0c;会发现读到市面上各种车企的各种ECU中的所有的故障码读出来都是3个字节。这与前面的五位故障码占2个字节不符&#xff0c;其实读出来是3个字节就是UDS中制定的规范。 如今车企中主要采用的是三个字节的故障码。…

【北京迅为】《iTOP-3588开发板系统编程手册》-第19章 V4L2摄像头应用编程

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

c++新特性 智能指针实验

1.概要 c新特性 智能指针实验 2.实验 2.1 共同代码 #pragma once class A { public:A();~A();void fun();int a 5; }; #include "A.h" #include <iostream>A::A() {std::cout << "structure\n"; } A::~A() {std::cout << "de…