在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服务
首先配置我们的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
开始测试
从结果我们可以看到,因为默认使用轮询算法,所以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
接下来测试
Nginx四层负载均衡
依旧是使用上面实验的架构图
不同的是我们将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;
}
}
接下来我们测试一下:
我们也可以分别给后端服务器加上权重。我就不一一做展示了,感兴趣的小伙伴可以动手实践一下,要记得:你动手了,知识才是你的。
最后我们来总结一下四层负载和七层负载的区别
- 四层负载均衡指的是负载均衡设备通过报文中的目标IP地址和端口加上负载均衡算法,进行负载调度
- 七层负载均衡,也被称为“内容交换”,指的是负载均衡设备通过报文中的应用层信息(URL、HTTP头部等信息)加上负载均衡算法,进行负载调度
二者的区别可以举个例子形象的说明:
- 四层负载均衡就像银行的自助排号机,每一个达到银行的客户根据排号机的顺序,选择对应的窗口接受服务
- 而七层负载均衡像银行大堂经理,先确认客户需要办理的业务,再安排排号。这样办理理财、存取款等业务的客户,会根据银行内部资源得到统一协调处理, 加快客户业务办理流程。
除此之外,使用七层负载还有一个好处就是安全性。在网络常见的SYN flood攻击中,黑客会控制大量客户端,使用虚假IP地址对目标服务器发动SYN攻击,通常这种攻击会发送大量的SYN报文,以此来耗尽目标服务器上的相关资源,达到Denial of Service(DoS)的目的。
而四层负载下这些SYN攻击都会被转发到后端服务器上,但是在七层负载模式下这些SYN攻击在负载均衡设备上就被截止了,不会影响到后端服务器正常运行
看了这篇文章如果对你有用的话记得点个 在看 哦