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实现上游服务器动态自动上下线无需reload的实现方法
Mar 31 Servers
浅谈Nginx 中的两种限流方式
Mar 31 Servers
windows下快速安装nginx并配置开机自启动的方法
May 11 Servers
nginx配置虚拟主机的详细步骤
Jul 21 Servers
Nginx配置文件详解以及优化建议指南
Sep 15 Servers
Nginx下SSL证书安装部署步骤介绍
Dec 06 Servers
Nginx禁止ip访问或非法域名访问
Apr 07 Servers
Tomcat项目启动失败的原因和解决办法
Apr 20 Servers
Windows和Linux上部署Golang并运行程序
Apr 22 Servers
nginx七层负载均衡配置详解
Jul 15 Servers
win7配置本地ftp服务器的图文教程
Aug 05 Servers
Nginx使用ngx_http_upstream_module实现负载均衡功能示例
Aug 05 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
php中目录,文件操作详谈
2007/03/19 PHP
关于php内存不够用的快速解决方法
2013/10/26 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
取得传值的函数
2006/10/27 Javascript
JavaScript进阶教程(第四课第一部分)
2007/04/05 Javascript
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
JS中表单的使用小结
2014/01/11 Javascript
javascript实现下拉提示选择框
2015/12/29 Javascript
表单input项使用label同时引用Bootstrap库导致input点击效果区增大问题
2016/10/11 Javascript
基于百度地图实现产品销售的单位位置查看功能设计与实现
2016/10/21 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
Angular中使用$watch监听object属性值的变化(详解)
2017/04/24 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
Python列表删除的三种方法代码分享
2017/10/31 Python
python opencv实现运动检测
2018/07/10 Python
Python3.7实现中控考勤机自动连接
2018/08/28 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
2019/08/12 Python
通过Turtle库在Python中绘制一个鼠年福鼠
2020/02/03 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
Python reversed反转序列并生成可迭代对象
2020/10/22 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
合伙经营协议书范本
2014/09/13 职场文书
党员四风自我剖析材料
2014/10/07 职场文书
延安红色之旅心得体会
2014/10/07 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
2015年暑期社会实践报告
2015/07/13 职场文书
岗位聘任协议书
2015/09/21 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书
导游词之南京中山陵
2019/11/27 职场文书
Python基于百度API识别并提取图片中文字
2021/06/27 Python
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis