ITPub博客

首页 > 数据库 > 数据库开发技术 > 干货篇 | Nginx 我还真不信你学不会(下)

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

原创 数据库开发技术 作者:咸鱼运维杂谈 时间:2021-06-08 17:42:00 0 删除 编辑

在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 80LISTEN     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.confupstream rs{
server 192.168.244.128; server 192.168.244.129;}
server{ listen 80; server_name 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 httpdCreated 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.htmlwelcome to my RS1 server!


  • 重启apache服务

[root@rs1 ~]# systemctl restart httpd
  • 我们来测试一下能不能访问到RS1以及它的网页有没有问题

[root@client ~]# curl 192.168.244.128welcome to my RS1 server!



RS2

  • 下载并启动apache服务

[root@rs2 ~]# yum install -y httpd
[root@rs2 ~]# systemctl start httpd
[root@rs2 ~]# systemctl enable httpdCreated 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.htmlwelcome to my RS2 server!


  • 重启apache服务

[root@rs2 ~]# systemctl restart httpd


  • 我们来测试一下能不能访问到RS2以及它的网页有没有问题

[root@client ~]# curl 192.168.244.129welcome to my RS2 server!


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


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


[root@client ~]# vim /etc/hosts192.168.244.141 


开始测试

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


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


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

[root@nginx-server ~]# vim /etc/nginx/conf.d/proxy.confupstream rs{
server 192.168.244.128 weight=2; server 192.168.244.129 weight=1;}
server{ listen 80; server_name 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 80LISTEN     0      128         :::80                      :::*
RS2是8080端口[root@rs2 ~]# ss -tanl | grep 8080LISTEN     0      128         :::8080                    :::*


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

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

[root@nginx-server ~]# vim /etc/nginx/conf.d/proxy.confstream{        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攻击在负载均衡设备上就被截止了,不会影响到后端服务器正常运行




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

原文作者:咸鱼运维杂谈;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
最新的技术文章首先发布在微信公众号:咸鱼运维杂谈 擅长Linux系统维护、开源软件维护、自动化运维等领域,博客主要偏向于学习笔记及经历分享

注册时间:2021-05-29

  • 博文量
    193
  • 访问量
    84233