Nginx 负载均衡是什么以及该如何配置


Posted in Servers onMarch 31, 2021

什么是负载均衡

负载均衡主要通过专门的硬件设备或者通过软件算法实现。通过硬件设备实现的负载均衡效果好、效率高、性能稳定,但是成本比较高。通过软件实现的负载均衡主要依赖于均衡算法的选择和程序的健壮性。均衡算法也是多种多样的,常见的有两大类:即静态负载均衡算法和动态负载均衡算法。静态算法实现比较简单,在一般网络环境下也能达到比较好的效果,主要有一般轮询算法、基于比率的加权轮询算法以及基于优先级的加权轮询算法等。动态负载均衡算法在较为复杂的网络环境中适应性更强,效果更好,主要有基于任务量的最少连接优先算法、基于性能的最快响应优先算法、预测算法及动态性能分配算法等。

网络负载均衡技术的大致原理是利用一定的分配策略将网络负载平衡地分摊到网络集群的各个操作单元上,使得单个重负载任务能够分担到多个单元上并行处理,或者使得大量并发访问或数据 流量分担到多个单元上分别处理,从而减少用户的等待响应时间。

Nginx服务器负载均衡配置

Nginx服务器实现了静态的基于优先级的加权轮询算法,主要使用的配置是proxy_pass指令和upstream指令,这些内容实际上很容易理解,关键点在于Nginx服务器的配置灵活多样,如何在配置负载均衡的同时合理地整合其他功能,形成一套可以满足实际需求的配置方案。

下面的有一些基础示例片段,当然不可能将所有的配置情况包括在内,希望能够起到抛砖引玉的效果,同时也需要大家在实际应用过程中多总结多积累。在配置中需要注意的地方将以注释的形式添加。

配置实例一:对所有请求实现一般轮询规则的负载均衡

     在以下实例片段中,backend服务器组中所有服务器的优先级全部配置为默认的weight=1,这样它们会按照一般轮询策略依次接收请求任务。该配置是一个最简单的实现Nginx服务器负载均衡的配置。所有访问www.myweb.name 的请求都会在backend服务器组中实现负载均衡。实例代码如下:

...
 
upstream backend                    #配置后端服务器组
{
    server 192.168.1.2:80;
    server 192.168.1.3:80;
    server 192.168.1.4:80;          #默认weight=1
}
server
{
    listen 80;
    server_name www.myweb.name;
    index index.html index.htm;
    location / {
        proxy_pass http://backend;
        prox_set_header Host $host;
    }
    ...
} 

配置实例二:对所有请求实现加权轮询规则的负载均衡

    与“配置实例一”相比,在该实例片段中,backend服务器组中的服务器被赋予了不同的优先级别,weight变量的值就是轮询策略中的“权值”。其中,192.168.1.2:80的级别最高,优先接收和处理客户端请求;192.168.1.4:80的级别最低,是接收和处理客户端请求最少的服务器,192.168.1.3:80将介于以上两者之间。所有访问www.myweb.name的请求都会在backend服务器组中实现加权负载均衡。实例代码如下:

...
 
upstream backend                    #配置后端服务器组
{
    server 192.168.1.2:80 weight=5;
    server 192.168.1.3:80 weight=2;
    server 192.168.1.4:80;          #默认weight=1
}
server
{
    listen 80;
    server_name www.myweb.name;
    index index.html index.htm;
    location / {
        proxy_pass http://backend;
        prox_set_header Host $host;
    }
    ...
}

配置实例三:对特定资源实现负载均衡

在该实例片段中,我们设置了两组被代理的服务器组,名为“videobackend”的一组用于对请求video资源的客户端请求进行负载均衡,另一组用于对请求filed资源的客户端请求进行负载均衡。所有对“http://www.mywebname/video/* ”的请求都会在videobackend服务器组中获得均衡效果,所有对“http://www.mywebname/file/* ”的请求都会在filebackend服务器组中获得均衡效果。该实例中展示的是实现一般负载均衡的配置,对于加权负载均衡的配置可以参考“配置实例二”。

    在location /file/ {......}块中,我们将客户端的真实信息分别填充到了请求头中的“Host”、“X-Real-IP”和“X-Forwareded-For”头域,这样后端服务器组收到的请求中就保留了客户端的真实信息,而不是Nginx服务器的信息。实例代码如下:

...
 
upstream videobackend                    #配置后端服务器组1
{
    server 192.168.1.2:80;
    server 192.168.1.3:80;
    server 192.168.1.4:80;
}
upstream filebackend                    #配置后端服务器组2
{
    server 192.168.1.5:80;
    server 192.168.1.6:80;
    server 192.168.1.7:80;
}
server
{
    listen 80;
    server_name www.myweb.name;
    index index.html index.htm;
    location /video/ {
        proxy_pass http://videobackend; #使用后端服务器组1
        prox_set_header Host $host;
        ...
    }
    location /file/ {
        proxy_pass http://filebackend;  #使用后端服务器组2
                                        #保留客户端的真实信息
        prox_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        ...
    }
}  

配置实例四:对不同域名实现负载均衡

在该实例片段中,我们设置了两个虚拟服务器和两组后端代理的服务器组,分别用来接收不同的域名请求和对这些请求进行负载均衡处理。如果客户端请求域名为“home.myweb.name”,则服务器server1接收并转向homebackend服务器组进行负载均衡处理;如果客户端请求域名为“bbs.myweb.name”,则由服务器server2接收bbsbackend服务器级进行负载均衡处理。这样就实现了对不同域名的负载均衡。

需要注意两组后端服务器组中有一台服务器server 192.168.1.4:80是公用的。在该服务器上需要部署两个域名下的所有资源才能保证客户端请求不会出现问题。实例代码如下:

...
upstream bbsbackend                    #配置后端服务器组1
{
    server 192.168.1.2:80 weight=2;
    server 192.168.1.3:80 weight=2;
    server 192.168.1.4:80;
}
upstream homebackend                    #配置后端服务器组2
{
    server 192.168.1.4:80;
    server 192.168.1.5:80;
    server 192.168.1.6:80;
}
                                        #开始配置server 1
server
{
    listen 80;
    server_name home.myweb.name;
    index index.html index.htm;
    location / {
        proxy_pass http://homebackend;
        prox_set_header Host $host;
        ...
    }
    ...
}
                                        #开始配置server 2
server
{
    listen 80;
    server_name bbs.myweb.name;
    index index.html index.htm;
    location / {
        proxy_pass http://bbsbackend;
        prox_set_header Host $host;
        ...
    }
    ...
}

配置实例五:实现带有URL重写的负载均衡

    首先,我们来看具体的源码,这是在实例一的基础上做的修改:

...
upstream backend                    #配置后端服务器组
{
    server 192.168.1.2:80;
    server 192.168.1.3:80;
    server 192.168.1.4:80;          #默认weight=1
}
server
{
    listen 80;
    server_name www.myweb.name;
    index index.html index.htm;
     
    location /file/ {
        rewrite ^(/file/.*)/media/(.*)\.*$) $1/mp3/$2.mp3 last;
    }
     
    location / {
        proxy_pass http://backend;
        prox_set_header Host $host;
    }
    ...
}

该实例片段与“配置一”相比,增加了对URI包含“/file/”的URL重写功能。例如客户端请求的URL为“http://www.myweb.name/file/downlaod/media/1.mp3 ”时,该虚拟服务器首先使用location file/ {......}块转发到后端的backend服务器组中实现负载均衡。这样,就车轻而易举地实现了带有URL重写功能的负载均衡。在该配置方案中,一定要掌握清楚rewrite指令中last标记和break标记的区别,才能达到预计的效果。

以上5个配置实例展示了Nginx服务器实现不同情况下负载均衡配置的基本方法。由于Nginx服务器的功能在结构上是增量式的,因此 ,我们可以在这些配置的基础上继续添加更多功能,比如Web缓存等功能,以及Gzip压缩技术、身份认证、权限管理等。同时在使用upstream指令配置服务器组时,可以充分发挥各个指令的功能,配置出满足需求、高效稳定、功能丰富的Nginx服务器。

以上就是Nginx 负载均衡是什么以及该如何配置的详细内容,更多关于Nginx 负载均衡的资料请关注三水点靠木其它相关文章!


Tags in this post...

Servers 相关文章推荐
使用nginx动态转换图片大小生成缩略图
Mar 31 Servers
nginx 反向代理之 proxy_pass的实现
Mar 31 Servers
Nginx 过滤静态资源文件的访问日志的实现
Mar 31 Servers
提升Nginx性能的一些建议
Mar 31 Servers
Nginx+Tomcat负载均衡集群的实现示例
Oct 24 Servers
Nginx图片服务器配置之后图片访问404的问题解决
Mar 21 Servers
Apache Hudi集成Spark SQL操作hide表
Mar 31 Servers
ubuntu下常用apt命令介绍
Jun 05 Servers
Linux下搭建SFTP服务器的命令详解
Jun 25 Servers
Windows Server 2008配置防火墙策略详解
Jun 28 Servers
Linux中各个目录的作用与内容
Jun 28 Servers
windows server2012 R2下安装PaddleOCR服务的的详细步骤
Sep 23 Servers
Nginx快速入门教程
nginx如何将http访问的网站改成https访问
Mar 31 #Servers
Nginx+Tomcat实现负载均衡、动静分离的原理解析
使用nginx动态转换图片大小生成缩略图
Mar 31 #Servers
Nginx反向代理多个服务器的实现方法
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
为什么 Nginx 比 Apache 更牛逼
Mar 31 #Servers
You might like
浅谈电磁辐射对健康的影响
2021/03/01 无线电
提升PHP执行速度全攻略
2006/10/09 PHP
php array_map array_multisort 高效处理多维数组排序
2009/06/11 PHP
php使用curl存储cookie的示例
2014/03/31 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
Laravel实现批量更新多条数据
2020/04/06 PHP
JavaScript中的对象化编程
2008/01/16 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
2011/06/28 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
Vue写一个简单的倒计时按钮功能
2018/04/20 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
vue中改变滚动条样式的方法
2020/03/03 Javascript
让IDE识别webpack的别名alias的实现方法
2020/05/06 Javascript
python使用append合并两个数组的方法
2015/04/28 Python
遍历python字典几种方法总结(推荐)
2016/09/11 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
python的常用模块之collections模块详解
2018/12/06 Python
利用python提取wav文件的mfcc方法
2019/01/09 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
python之生成多层json结构的实现
2020/02/27 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
Django xadmin安装及使用详解
2020/10/26 Python
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
酒吧总经理岗位职责
2013/12/10 职场文书
公司节能减排倡议书
2014/05/14 职场文书
超市仓管员岗位职责范本
2014/09/18 职场文书
大三学年自我鉴定范文(3篇)
2014/09/28 职场文书
授权委托书协议书
2014/10/16 职场文书
如何写好竞聘报告
2019/04/03 职场文书
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby