nginx的七层和四层负载均衡

2023-10-26

1、负载均衡目的:

  • 将前端超高并发访问转发至后端多台服务器进行处理,解决单个节点压力过大,造成Web服务响应过慢,严重的情况下导致服务瘫痪,无法正常提供服务的问题。

2、 工作原理:

  • 负载均衡分为四层负载均衡七层负载均衡
  • 四层负载均衡是工作在七层协议的第四层-传输层,主要工作是转发
  • 它在接收到客户端的流量以后通过修改数据包的地址信息(目标地址和端口和源地址)将流量转发到应用服务器。
  • 七层负载均衡是工作在七层协议的第七层-应用层,主要工作是代理
  • 它首先会与客户端建立一条完整的连接并将应用层的请求流量解析出来,再按照调度算法选择一个应用服务器,并与应用服务器建立另外一条连接将请求发送过去。
    在这里插入图片描述

3、配置七层均衡:

  • 前端服务器:192.168.2.10
  • 后端服务器1:192.168.2.20
  • 后端服务器2:192.168.2.30
  • 前端服务器主要配置upstreamproxy_pass:
  • upstream 主要是配置均衡池和调度方法。
  • proxy_pass 主要是配置代理服务器ip或服务器组的名字。
  • proxy_set_header 主要是配置转发给后端服务器的Host和前端客户端真实ip。

3.1、配置前端服务器:

[root@bogon nginx]# vim   /usr/local/ngin/conf/nginx.conf
# 在http指令块下配置upstream指令块
upstream web {
server 192.168.2.20;
server 192.168.2.30;
}
# 在location指令块配置proxy_pass
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web;
proxy_next_upstream error http_404 http_502;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
[root@bogon nginx]#  /usr/local/nginx/sbin/nginx  -s reload
  • proxy_next_upstream error http_404 http_502;

通过这个指令,可以处理当后端服务返回404等报错时,直接将请求转发给其他服务器,而不是把报错信息返回客户端。

  • proxy_set_header Host $host;

通过这个指令,把客户端请求的host,转发给后端。

  • proxy_set_header X-Real-IP $remote_addr

通过这个指令,把客户端的IP转发给后端服务器,在后端服务器的日志格式中,添加$http_x_real_ip即可获取原始客户端的IP了。

3.2、配置后端服务器:

在后端服务器192.168.2.20配置如下(配置文件不需要修改即可)
vim /usr/local/nginx/html/index.html
this is 2.20 page
在后端服务器192.168.2.30配置如下(配置文件不需要修改即可)
vim /usr/local/nginx/html/index.html
this is 2.30 page

3.3、 均衡方式:

3.3.1、轮询:

upstream web {
server 192.168.2.20;
server 192.168.2.30;
[root@bogon nginx]# /usr/local/nginx/sbin/nginx  -s reload

}
  • 访问前端IP验证:
[root@localhost ~]# while  true;do curl  192.168.2.10;sleep 2;done
this is 2.20 page
         this is 2.30 page
this is 2.20 page
         this is 2.30 page
this is 2.20 page
         this is 2.30 page
#可以看到后端服务器,非常平均的处理请求。

3.3.2、轮询加权重:

upstream web {
server 192.168.2.20 weight=3;
server 192.168.2.30  weight=1;
}
默认是weight=1
[root@bogon nginx]# /usr/local/nginx/sbin/nginx  -s reload

  • 访问前端服务器IP验证:
[root@localhost ~]# while  true;do curl  192.168.2.10;sleep 2;done
this is 2.20 page
this is 2.20 page
this is 2.20 page
         this is 2.30 page
this is 2.20 page
this is 2.20 page
this is 2.20 page
         this is 2.30 page
#后端服务,根据权重比例处理请求,适用于服务器性能不均的环境。         

3.3.3、最大错误连接次数:

  • 错误的连接由proxy_next_upstream, fastcgi_next_upstream等指令决定,且默认情况下,后端某台服务器出现故障了,nginx会自动将请求再次转发给其他正常的服务器(因为默 proxy_next_upstream error timeout)。
  • 所以即使我们没有配这个参数,nginx也可以帮我们处理error和timeout的相应,但是没法处理404等报错。
  • 为了看清楚本质,可以先将proxy_next_upstream设置为off,也就是不将失败的请求转发给其他正常服务器,这样我们可以看到请求失败的结果。
vim /usr/local/nginx/conf/nginx.conf
upstream web {
server 192.168.2.20 weight=1 max_fails=3 fail_timeout=9s;
#先将2.20这台nginx关了。
server 192.168.2.30 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web;
#proxy_next_upstream error http_404 http_502;
proxy_next_upstream off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
[root@bogon nginx]# /usr/local/nginx/sbin/nginx  -s reload
# 在这里,我们将超时时间设置为9s,最多尝试3次,
这里要注意,尝试3次,依然遵循轮询的规则,并不是一个请求,连接3次,
而是轮询三次,有3次处理请求的机会
  • 访问前端服务器IP验证:
[root@localhost ~]# while  true;do curl -I 192.168.2.10  2>/dev/null|grep HTTP/1.1 ;sleep 3;done
HTTP/1.1 502 Bad Gateway
HTTP/1.1 200 OK
HTTP/1.1 502 Bad Gateway
HTTP/1.1 200 OK
HTTP/1.1 502 Bad Gateway
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 502 Bad Gateway
HTTP/1.1 200 OK
我们设置的超时时间为9s,我们是每3s请求一次。
我们可以看到后端一台服务器挂了后,请求没有直接转发给正常的服务器,
而是直接返回了502。尝试三次后,等待9s,才开始再次尝试(最后一个502)。
要注意,第二行的200响应,并不是客户端第一次的请求的响应码,而是客户端第二次新的请求。
  • 把proxy_next_upstream开启,再来访问看结果:
vim /usr/local/nginx/conf/nginx.conf
upstream web {
server 192.168.2.20 weight=1 max_fails=3 fail_timeout=9s;
#先将2.20这台nginx关了。
server 192.168.2.30 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web;
proxy_next_upstream error http_404 http_502;
#proxy_next_upstream off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
[root@bogon nginx]# /usr/local/nginx/sbin/nginx  -s reload
  • 访问前端服务器IP验证:
[root@localhost ~]# while  true;do curl -I 192.168.2.10  2>/dev/null|grep HTTP/1.1 ;sleep 3;done
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK

可以看到现在没有502报错,请求都处理了。因为错误的响应码被proxy_next_upstream 获取,这次请求
被转发给下一个正常的服务器了。
所以看到都是200,但是你应该清楚,哪个200是响应的上个服务器没有处理请求,哪个200是正常的响应。

3.3.4、ip_hash:

  • 通过客户端ip进行hash,再通过hash值选择后端server 。
vim /usr/local/nginx/conf/nginx.conf
upstream web {
ip_hash;
server 192.168.2.20 weight=1 max_fails=3 fail_timeout=9s;
server 192.168.2.30 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web;
proxy_next_upstream error http_404 http_502;
#proxy_next_upstream off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
[root@bogon nginx]# /usr/local/nginx/sbin/nginx  -s reload
  • 访问前端服务器IP验证:
[root@localhost ~]# while  true;do curl  192.168.2.10;sleep 2;done
         this is 2.30 page
         this is 2.30 page
         this is 2.30 page
         this is 2.30 page
         this is 2.30 page
         this is 2.30 page
[root@localhost ~]# curl 192.168.2.20
this is 2.20 page
#可以看到2.20的服务是正常的,但是却不转发给2.20了,请求固定在了2.30的服务器上。
  • 在使用负载均衡的时候会遇到会话保持的问题,常用的方法有:
    a、ip hash,根据客户端的IP,将请求分配到不同的服务器上;
    b、cookie,服务器给客户端下发一个cookie,具有特定cookie的请求会分配给它的发布者。

3.3.5、url_hash:

vim /usr/local/nginx/conf/nginx.conf
upstream web {
hash $request_uri consistent;
server 192.168.2.20;
server 192.168.2.30;
}
[root@bogon nginx]# /usr/local/nginx/sbin/nginx  -s reload

3.3.5、根据响应时间均衡:

# 下载模块:
wget https://github.com/gnosek/nginx-upstream-fair/archive/master.zip
# 解压:
unzip master.zip
# 修改源码bug:
sed -i 's/default_port/no_port/g' ngx_http_upstream_fair_module.c
# 预编译:
./configure --prefix=/usr/local/nginx --add-module=../echo-nginx-module --withhttp_stub_status_module --add-module=../nginx-upstream-fair-master
# 编译/安装:
make && make install
# 配置:
upstream web {
fair;
server 192.168.2.20 weight=1 max_fails=3 fail_timeout=9s;
server 192.168.2.30 weight=1;
}

3.3.6、备用服务器:

upstream web {
server 192.168.2.20 weight=1 max_fails=3 fail_timeout=9s;
server 192.168.2.30 weight=1 backup;
}
# 2.30的服务器做备用服务器,只有在2.30得服务器不能提供服务时,才会自动顶上,否则,默认是不提供服务的。

4、配置四层均衡:

  • 前端服务器:192.168.2.10
  • 后端服务器1:192.168.2.20
  • 后端服务器2:192.168.2.30
  • 前端服务器主要配置stream和upstream,注意该模块需要在预编译时指定,没有被默认编译进nginx。

4.1、配置前端服务器:

#预编译:
./configure --prefix=/usr/local/nginx --add-module=../echo-nginx-module --withhttp_stub_status_module --with-stream
# 编译/安装:
make && make install
make  upgrade
# 在main全局配置stream:
events {
worker_connections 1024;
}
stream {
upstream web {
# 必须要指定ip加port
server 192.168.2.20:80;
server 192.168.2.30:80;
}
server {
listen 80;
# 连接上游服务器超时间,超过则选择另外一个服务器
proxy_connect_timeout 3s;
# tcp连接闲置时间,超过则关闭
proxy_timeout 10s;
proxy_pass web;
}
log_format proxy '$remote_addr $remote_port $protocol $status
[$time_iso8601] '
'"$upstream_addr" "$upstream_bytes_sent"
"$upstream_connect_time"' ;
access_log /usr/local/nginx/logs/proxy.log proxy;
}

4.2、配置后端测试页面:

在后端服务器192.168.2.20配置如下(配置文件不需要修改即可)
vim /usr/local/nginx/html/index.html
this is 2.20 page
在后端服务器192.168.2.30配置如下(配置文件不需要修改即可)
vim /usr/local/nginx/html/index.html
this is 2.30 page

4.3、访问前端服务器IP测试:

- 在后端2.30上访问前端IP
[root@localhost ~]# curl 192.168.2.10
this is 2.20 page
- 查看后端2.20日志
[root@bogon nginx]# tail -1 /usr/local/nginx/logs/host.access.log
192.168.2.10 - - [26/Apr/2020:03:16:37 +0800] "GET / HTTP/1.1" 200 18 "-" "curl/7.29.0" "-"
-查看前端2.10日志
[root@bogon nginx]# tail -1  /usr/local/nginx/logs/proxy.log
192.168.2.30 45420 TCP 200 [2020-04-25T19:23:35+08:00] "192.168.2.20:80" "76""0.001"

4.4、端口转发:

#在前端2.10配置:
[root@bogon nginx]# vim conf/nginx.conf
events {
    worker_connections  1024;
}
stream  {
        upstream  web   {
                server  192.168.2.20:22;
#               server  192.168.2.30:80;
}
        server  {
                listen  6666;
                proxy_connect_timeout  3s;
                proxy_timeout   10s;
                proxy_pass   web;
}

  log_format proxy '$remote_addr $remote_port $protocol $status [$time_iso8601] ' '"$upstream_addr" "$upstream_bytes_sent""$upstream_connect_time"' ;
access_log /usr/local/nginx/logs/proxy.log proxy;
}
[root@bogon nginx]# /usr/local/nginx/sbin/nginx  -s reload
#在另外一台服务器访问:
[root@localhost ~]# ssh 192.168.2.10 -p 6666
root@192.168.2.10's password: 
Last login: Sun Apr 26 03:31:45 2020 from www.ys.com
#可以看到已经登上2.20服务器上了
[root@bogon ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:2c:72:99 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.20/24 brd 192.168.2.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::7e7a:cabd:3b11:a545/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nginx的七层和四层负载均衡 的相关文章

随机推荐

  • Java加密之IV

    AES是一种 分组密码 密码学中 分组 block 密码的工作模式 mode of operation 允许使用同一个分组密码密钥对多于一块的数据进行加密 并保证其安全性 分组密码自身只能加密长度等于密码分组长度的单块数据 若要加密变长数据
  • LeetCode 127. 单词接龙(C++)*

    思路 1 如果采用回溯法来的话会超时 2 这里采用构造图和广度优先遍历结合来实现 首先要构造图 需要将每个字符串对应一个数字id 然后边的构造使用矩阵来实现 这里采用将每一个字符串的id连接每个将该字符串的其中一个字符改为未知字符的字符串的
  • Python ffmpeg视频处理

    2 源码 coding utf 8 import ffmpeg import getpass import subprocess import matplotlib pyplot as plt import cv2 import numpy
  • android studio(自带SDK)安装教程

    下载网址 http www android studio org index php download hisversion 当下载为 exe程序时 直接双击 exe程序 之后点击Next 第一地址是安装路径 自己选择即可 第二个是SDK路
  • 手把手教你搭建Windows环境微信小程序的本地测试服务器

    Mac环境下 手把手教你搭建Mac环境微信小程序的本地测试服务器 问题的提出 Windows环境 方便快捷地搭建小程序的测试服务器 小程序对于网络请求的URL的特殊要求 不能出现端口号 不能用localhost 必须用https 主要步骤
  • elementUI侧边栏实现响应式,响应式侧边栏

    实现思路 准备两份aside侧边栏 借助display和媒体查询实现响应式 以下是完整代码
  • 初次使用vite新建项目报错

    第一次使用vite新建项目时报错 C Users AppData Roaming npm cache npx 13100 node modules create vite index js 4 import fs from node fs
  • 测试报告(进阶)

    功能测试可以手写一份测试报告 一 如何自动生成测试报告 unittest生成测试报告 测试用例 账号正确 密码错误 自己依照测试用例输入一组账号 点登录 会出现信息 密码错误 代码 import unittest import time f
  • vue 监听div宽高变化

    npm install element resize detector save import elementResizeDetectorMaker from element resize detector mounted const th
  • 如何使用chatglm-6b实现多卡训练

    首先先说ChatGLM 6b是支持多卡训练的 步骤如下 1 安装 NVIDIA CUDA Toolkit 要使用多卡训练 需要安装 CUDA Toolkit 可以在 NVIDIA 官网下载适用于操作系统的 CUDA 版本 2 确认所有的显卡
  • 实验四 MGRE与OSPF综合实验

    1 R6为ISP只能配置IP地址 R1 R5的环回为私有网段 2 R1 4 5为全连的MGRE结构 R1 2 3的星型的拓扑结构 R1为中心站点 3 所有私有网段可以互相通讯 私有网段使用OSPF完成 新建拓扑图 配置合理的IP R1 R2
  • 解决IDEA、PyCharm、PhpStorm及Android Studio中输入法卡住、光标不跟随的问题

    2017新版JetBrains全家桶下的各个软件都存在使用中文输入法时出现类似卡住 即光标不跟随的现象 解决办法 删除软件所在根目录下的jre或jre64文件夹 删除后软件会自动使用本机的jre 并可能提示jie已不是最新版 但不影响使用
  • 详解Vector

    目录 一 Vector介绍 二 源码解析 1 Vector实现的接口 2 Vector的构造方法 1 无参构造方法 2 带初始容量的构造方法 3 带初始容量和增量的构造方法 4 集合型构造方法 3 Vector中的变量 4 Vector主要
  • HttpRunner v4 一条用例是怎么被执行的

    HttpRunner 4 0版本 支持多种用例的编写格式 YAML JSON go test pytest 其中后面两种格式我们都知道通过调用测试函数执行 那YAML JSON这两种用例格式到底是怎样被运行的呢 下面我们一起分析一下 注意
  • zotero翻译、界面、笔记字体大小设置

    zotero翻译 界面 笔记字体大小设置 方式一 编辑器出设置 图中分别对应翻译 界面 笔记字体大小设置 方式二 图形界面设置
  • PC端本地存储方案,Windows和Mac双端通用方案

    功能要求 缓存数据 没有频繁的读写 存储服务端下发的数据 当数据有更新的时候 本地存储会进行更新 同时刷新内存 本地存储作为持久化储存方案 程序每次启动时会读取数据加载到内存 当数据有更新的时候 也会进行内存刷新 从需求解析 存储的特点是持
  • SSM——3.Mybatis的增删改查

    目录 1查询所有数据 2根据id进行查询 3 插入一条数据 4 获取插入数据的id 5 根据id进行删除 6 修改数据 7 小结 前面实践篇我们讲了如何从零创建一个Mybatis项目 然后原理篇我们浅讲了一下Mybatis的实现原理及流程
  • uni-app 调用安卓 高德sdk获取经纬度(替代 uni.getLocation)

    因为项目需要用到精确打卡 所以一两秒就要更新一次经纬度 uni app 按照官方接了离线安卓高德sdk 链接 高德sdk 离线链接 用 uni getLocation 获取到的经纬度是蛮准的 有六位小数 但是拿着手机走一段距离 居然要二三十
  • UE4.27.2 Android开发环境配置

    虚幻官方文档链接 https docs unrealengine com 4 27 zh CN SharingAndReleasing Mobile Android AndroidSDKRequirements 虚幻4 27配置Androi
  • nginx的七层和四层负载均衡

    1 负载均衡目的 将前端超高并发访问转发至后端多台服务器进行处理 解决单个节点压力过大 造成Web服务响应过慢 严重的情况下导致服务瘫痪 无法正常提供服务的问题 2 工作原理 负载均衡分为四层负载均衡和七层负载均衡 四层负载均衡是工作在七层