[code.nginx] Nginx服务器的负载均衡

Nginx服务器反向代理服务的一个重要用途是实现负载均衡。随着信息数量的不断增长,目前网络的业务量的急剧升高,访问量和数据流量也在飞速增长,因而对网络本身的处理能力和计算强度的要求也越来越高。现有的网络硬件条件显然不能满足日益增长的需求,但是完全抛弃已有的硬件环境又是不现实的,于是,就出现了“网络负载均衡”(Load Balancing)这样的技术,该技术一出现就在网络建设中得到普及。

什么是负载均衡

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

在实际应用中,负载均衡会根据网络的不同层次(一般按照OSI的七层参考模型)进行划分。现在的负载均衡技术主要实现和作用于网络的第四层或第七层,完全独立于网络基础硬件设备,成为单独的技术设备。nginx服务器实现的负载均衡一般认为是七层负载均衡。
负载均衡主要通过专门的硬件设备实现或者通过软件算法实现。通过硬件设备实现的负载均衡效果好、效率高、性能稳定,但是成本比较高。通过软件实现的负载均衡主要依赖于负载均衡算法的选择和程序的健壮性。均衡算法也是多种多样的,常见的有两大类:即静态负载均衡算法和动态负载均衡算法。静态算法实现比较简单,在一般网络环境下也能达到比较好的效果,主要有一般轮询算法、基于比率的加权轮询算法以及基于有限级的加权鲁迅算法等。动态负载均衡算法在较为负载的网络环境中适应性更强,效果更好,主要有基于性能量的最少连接优先算法、基于性能的最快响应优先算法、预测算法及动态性能分配算法等。

Nginx服务器负载均衡配置

理解了“负载均衡”的概念,就可以利用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;
      }
      server
     {
              listen 80;
              server_name www.myweb.name;
              index index.html index.html
              location / {
                     proxy_pass http://backend;
                     proxy_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;      
      }
      server
     {
           listen 80;
          server_name www.myweb.name;
          index index.html  index.htm;
          location / {
                proxy_pass  http://backend;
                proxy_set_header  Host  $host;
                ...  
        }
        ...
     }

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

在该实例片段中,我们设置了两组被代理的服务器组,名为“videobackend”的一组用于对请求video资源的客户端请求进行资源负载,另一组用于对请求file资源的客户端请求进行负载均衡。通过对location块uri的不同配置,我们就很轻易的实现了对特定资源的负载均衡。所有对“http://www.myweb.name/video/”的请求都会在videobackend服务器组中获得均衡效果,所有对“http://www.myweb.name/file/”的请求都会在filebackend服务器组中获得均衡效果。在该实例中展示的是实现一般负载均衡的配置,对于加权负载均衡的配置可以参考“配置实例二”。
在location /file/ {......}块中,我们将客户端的真实信息分别填充到了请求头的“Host"、“X-Real-IP”和“X-Forwarded-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
        {
                linsten 80;
                server_name www.myweb.name;
                index index.html index.htm;
                location /video/ {
                {
                        proxy_pass  http://viewbackend;
                        proxy_set_header  Host $host;
                        ...
                }
                location /file/ {
                       proxy_pass http://filebackend;  #使用后端服务器组2
                       proxy_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”,则由服务器server 1接收并转向homebackend服务器组进行负载均衡处理。如果客户端请求域名为“bbs.myweb.name”,则由服务器server2接收并转向bbsbackend服务器组进行负载均衡处理。这样就实现了对不同域名的负载均衡。
需要注意两组后端服务器组中有一台服务器server 192.168.1.4:80是公用的。在该服务器上需要部署两个域名下的所有资源才能保证客户端请求不会出现问题。实例代码如下:

        ...
        upstream bbsbackend
        {
                  server 192.168.1.2:80  weight = 2;
                  server 192.168.1.3:80  weight = 2;
                  server 192.168.1.4:80;
        }
        upstream homebackend
        {
                  server 192.168.1.4:80;
                  server 192.168.1.5:80;
                  server 192.168.1.6:80;
        }

        server            #开始配置server 1
        {
                    listen 80;
                    server_name  home.myweb.com;
                    index index.html  index.htm;
                    location / {
                              proxy_pass  http://homebackend;
                              proxy_set_header  Host  $host;
                              ...
                  }
                  ...
        }
        server            #开始配置server 2
        {
                     listen 81;
                     server_name  bbs.myweb.name;
                     index index.html index.html;
                     location / {
                              proxy_pass http://bbsbackend;
                              proxy_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;
      }
      server
      {
              listen 80;
              server_name  www.myweb.name;
              index index.html  index.html;
              location  /file/  {
                        rewrite  ^(/file/.*)/media/(.*)\.*$  $1/mp3/$2.mp3  last;
              }
              location / {
                       proxy_pass  http://backend;
                       proxy_set_header  Host $host;
                       ... 
             }
              ...
      }

该实例片段与“配置实例一”相比,增加对URI包含“/file/”的URL重写功能。例如客户端的请求URL为“http://www.myweb.name/file/download/media/1.mp3”时,该虚拟服务器首先使用location file/ {.....}块将该URL进行重写为http://www.myweb.name/file/download/mp3/1.mp3,然后新的URL再由location / {......}块转发到后端的backend服务组中实现负载均衡。这样,就轻而易举地实现了带有URL重写功能的负载均衡。在该配置方案中,一定要掌握清楚rewrite指令中last标记和break标记的区别,才能达到预计的效果。
以上5个配置实例展示了Nginx服务器实现不同情况下负载均衡配置的基本方法。由于Nginx服务器的功能在结构上是增量式的,因此,我们可以在这些配置的基础上继续添加更多功能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 【摘要】 面对大量用户访问、高并发请求,海量数据,可以使用高性能的服务器、大型数据库,存储设备,高性能Web服务器...
    静修佛缘阅读 4,458评论 0 24
  • ** 内容安排: ** 简介 区别 Nginx、LVS及HAProxy负载均衡软件的优缺点 一、简介 ** 所谓四...
    薛晨阅读 66,786评论 12 159
  • 记录下今天的发生,蓝风暴波最后一日宇宙的蓝猴,阴历七月初一,日食。 意外在这样一天竟然机缘巧合的进行了一场清理,亚...
    天心觉心禧舍阅读 341评论 0 1
  • 文 / 狸子 他大她六岁。两人相亲认识,以父母之命进行婚嫁,完成婚姻之事。 他跟她,都是没有妈妈只有爸爸的缺爱的家...
    是狸子阅读 264评论 6 6