干货篇 | Nginx 我还真不信你学不会(下)

在Nginx系列篇中,我们介绍了Nginx的一些基础知识以及如何安装以及使用Nginx,并搭建我们的虚拟主机

今天我们来了解关于Nginx负载均衡的一些知识以及如何通过Nginx来实现负载均衡

我们首先来回顾一下什么是负载均衡

  • 负载(量):反向代理收到来自客户端的访问请求
  • 均衡:反向代理用来处理收到的请求的规则(算法)

可以看到,负载均衡就是将接收到的访问请求按照一定的规则(算法)均衡地分发到后端服务器。

而负载均衡又可以分四层负载均衡和七层负载均衡。这里的四层和七层是指OSI七层模型中的运输层和应用层。至于四层负载均衡和七层负载均衡,到后面的具体案例中我会具体讲解

接下来我们先看一下Nginx负载均衡调度有什么规则(算法)

Nginx负载均衡算法

  • 轮询(默认)。也叫rr,将接收到的请求按照顺序逐一分发到不同的后端服务器,如果某台后端服务器出现故障或者宕机,会自动去除故障服务器,使用户访问不受影响
  • weight(加权轮询)。也就是指带权重值的轮询算法,weight值越大,分配到的概率也就越高。主要用于后端每台服务器性能不均衡的情况,或者说仅仅为在主从的情况下设置不同的权重(weight)值,可以有效的利用服务器资源
  • SH(源地址hash,也叫ip_hash)。将来自于同一个源ip地址的请求始终分发到第一次分配到的后端服务器
  • url_hash(url哈希)。按照访问的url的哈希结果来进行分配,每个相同请求的url会被定向到某一台后端服务器,进一步提高后端服务器缓存的效率。如果要使用这种算法,需要安装hash软件包
  • fair(智能调度)。可以根据后端服务器的响应请求时间智能地进行均衡分发,比如说响应时间短的优先分配。如果要使用这种算法,则需要安装upstream_fair模块

Nginx负载均衡案例

接下来我们来通过两个案例来了解一下Nginx是如何实现负载均衡的

Nginx七层负载均衡

也称内容交换,就是在应用层那里进行负载均衡。

指的是负载均衡设备通过报文中的应用层信息(HTTP头部,URL等)和负载均衡算法,将请求均衡地分发到后端服务器。

本次案例需要到四台机器(一台做客户端,一台做反向代理服务器,两台做后端服务器),并且他们都处在内网中。

两台后端服务器采用的是apache来提供web服务

img

首先配置我们的Nginx服务器:

  • 下载并安装nginx
[root@nginx-server ~]# yum install -y nginx
  • 关闭防火墙和selinux
[root@nginx-server ~]# setenforce 0
 
[root@nginx-server ~]# systemctl stop firewalld
  • 启动nginx
[root@nginx-server ~]# nginx
  
 确认一下服务有没有开启
 [root@nginx-server ~]# ss -tanl | grep 80
LISTEN     0      128          *:80                       *:*
LISTEN     0      128         :::80                      :::*
  • 实现负载均衡的配置文件

我们后端服务器的ip地址分别为192.168.244.129和192.168.244.128

实现负载均衡需要我们的 upstream 模块

我们在存放nginx模块配置文件目录下创建一个 proxy.conf 来配置我们的文件

默认是轮询算法
[root@nginx-server ~]# vim /etc/nginx/conf.d/proxy.conf
upstream rs{
​
        server 192.168.244.128;
        server 192.168.244.129;
}
​
server{
        listen 80;
        server_name www.xxoo.com;
        location / {
                proxy_pass http://rs;
        }}
​
别忘了重启
[root@nginx-server ~]# nginx -s reload

部署好Nginx服务器之后我们来部署后端服务器RS1和RS2

RS1:

  • 下载并启动apache服务
[root@rs1 ~]# yum install -y httpd

[root@rs1 ~]# systemctl start httpd

[root@rs1 ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
  • 关闭防火墙和selinux
[root@rs1 ~]# systemctl stop firewalld

[root@rs1 ~]# setenforce 0
  • 搭建apache web站点
[root@rs1 ~]# vim /var/www/html/index.html
welcome to my RS1 server!
  • 重启apache服务
[root@rs1 ~]# systemctl restart httpd
  • 我们来测试一下能不能访问到RS1以及它的网页有没有问题
[root@client ~]# curl 192.168.244.128
welcome to my RS1 server!

RS2

  • 下载并启动apache服务
[root@rs2 ~]# yum install -y httpd

[root@rs2 ~]# systemctl start httpd

[root@rs2 ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
  • 关闭防火墙和selinux
[root@rs2 ~]# systemctl stop firewalld

[root@rs2 ~]# setenforce 0
  • 搭建apache web站点
[root@rs2 ~]# vim /var/www/html/index.html
welcome to my RS2 server!
  • 重启apache服务
[root@rs2 ~]# systemctl restart httpd
  • 我们来测试一下能不能访问到RS2以及它的网页有没有问题
[root@client ~]# curl 192.168.244.129
welcome to my RS2 server!

所有服务部署完毕后我们来检验一下:

先在我们的客户端上配置dns解析文件

[root@client ~]# vim /etc/hosts
192.168.244.141 www.xxoo.com

开始测试

img

从结果我们可以看到,因为默认使用轮询算法,所以nginx服务器会将访问请求按照时间顺序逐一的分发到后端服务器

我们将算法改成加权轮询试试

首先修改配置文件,在后端服务器地址上加上权重值

[root@nginx-server ~]# vim /etc/nginx/conf.d/proxy.conf
upstream rs{

        server 192.168.244.128 weight=2;
        server 192.168.244.129 weight=1;
}

server{
        listen 80;
        server_name www.xxoo.com;
        location / {
                proxy_pass http://rs;
        }

}

[root@nginx-server ~]# nginx -s reload

接下来测试

img

Nginx四层负载均衡

依旧是使用上面实验的架构图

img

不同的是我们将RS2的web端口改成8080,RS1还是80端。并且nginx服务器的端口改成了8080。

RS1是80端口
[root@rs1 ~]# ss -tanl | grep 80
LISTEN     0      128         :::80                      :::*

RS2是8080端口
[root@rs2 ~]# ss -tanl | grep 8080
LISTEN     0      128         :::8080                    :::*

配置四层负载均衡配置文件(注意:我们需要nginx里面的stream模块)

stream模块只能写在 nginx.conf 配置文件里面,在http字段上面,同级

[root@nginx-server ~]# vim /etc/nginx/conf.d/proxy.conf
stream{
        server{
                listen 8080;
                proxy_pass web;             
        }

        upstream web{
                server 192.168.244.128:80;
                server 192.168.244.129:8080;
        }
}

接下来我们测试一下:

img

我们也可以分别给后端服务器加上权重。我就不一一做展示了,感兴趣的小伙伴可以动手实践一下,要记得:你动手了,知识才是你的。

最后我们来总结一下四层负载和七层负载的区别

  • 四层负载均衡指的是负载均衡设备通过报文中的目标IP地址和端口加上负载均衡算法,进行负载调度
  • 七层负载均衡,也被称为“内容交换”,指的是负载均衡设备通过报文中的应用层信息(URL、HTTP头部等信息)加上负载均衡算法,进行负载调度

二者的区别可以举个例子形象的说明:

  • 四层负载均衡就像银行的自助排号机,每一个达到银行的客户根据排号机的顺序,选择对应的窗口接受服务
  • 而七层负载均衡像银行大堂经理,先确认客户需要办理的业务,再安排排号。这样办理理财、存取款等业务的客户,会根据银行内部资源得到统一协调处理, 加快客户业务办理流程。

除此之外,使用七层负载还有一个好处就是安全性。在网络常见的SYN flood攻击中,黑客会控制大量客户端,使用虚假IP地址对目标服务器发动SYN攻击,通常这种攻击会发送大量的SYN报文,以此来耗尽目标服务器上的相关资源,达到Denial of Service(DoS)的目的。

而四层负载下这些SYN攻击都会被转发到后端服务器上,但是在七层负载模式下这些SYN攻击在负载均衡设备上就被截止了,不会影响到后端服务器正常运行


看了这篇文章如果对你有用的话记得点个 在看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼Linux运维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值