在上一篇博客我们介绍了 Nginx 一个很重要的功能——代理,包括正向代理和反向代理。这两个代理的核心区别是:正向代理代理的是客户端,而反向代理代理的是服务器。其中我们又重点介绍了反向代理,以及如何通过 Nginx 来实现反向代理。那么了解了Nginx的反向代理之后,我们要通过Nginx的反向代理实现另一个重要功能——负载均衡。

回到顶部

1、负载均衡的由来

  早期的系统架构,基本上都是如下形式的:

  

  客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。

  这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?

  我们首先想到的可能是升级服务器的配置,比如提高CPU执行频率,加大内存等提高机器的物理性能来解决此问题,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢?

  上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

  

  负载均衡完美的解决了单个服务器硬件性能瓶颈的问题,但是随着而来的如何实现负载均衡呢?客户端怎么知道要将请求发送到那个服务器去处理呢?

回到顶部

2、Nginx实现负载均衡

  Nginx 服务器是介于客户端和服务器之间的中介,通过上一篇博客讲解的反向代理的功能,客户端发送的请求先经过 Nginx ,然后通过 Nginx 将请求根据相应的规则分发到相应的服务器。

  

  主要配置指令为上一讲的 pass_proxy 指令以及 upstream 指令。负载均衡主要通过专门的硬件设备或者软件算法实现。通过硬件设备实现的负载均衡效果好、效率高、性能稳定,但是成本较高。而通过软件实现的负载均衡主要依赖于均衡算法的选择和程序的健壮性。均衡算法又主要分为两大类:

  静态负载均衡算法:主要包括轮询算法、基于比率的加权轮询算法或者基于优先级的加权轮询算法。

  动态负载均衡算法:主要包括基于任务量的最少连接优化算法、基于性能的最快响应优先算法、预测算法及动态性能分配算法等。

  静态负载均衡算法在一般网络环境下也能表现的比较好,动态负载均衡算法更加适用于复杂的网络环境。

  例子:

①、普通轮询算法

  这是Nginx 默认的轮询算法。

例子:两台相同的Tomcat服务器,通过 localhost:8080 访问Tomcat1,通过 localhost:8081访问Tomcat2,现在我们要输入 localhost 这个地址,可以在这两个Tomcat服务器之间进行交替访问。

  一、分别修改两个Tomcat服务器的端口为8080和8081。然后再修改Tomcat的首页,使得访问这两个页面时能够区分。如下:

  修改端口号文件为 server.xml :

  

  修改首页的路径为:webapps/ROOT/index.jsp

  

  修改完成之后,分别启动这两个Tomcat服务器,然后分别输入相应的地址端口号:

  输入地址:localhost:8081

  

  输入地址:localhost:8080

  

  二、修改 nginx 的配置文件 nginx.conf

 1     upstream OrdinaryPolling {2     server 127.0.0.1:8080;3     server 127.0.0.1:8081;4     }5     server {6         listen       80;7         server_name  localhost;8 9         location / {
10             proxy_pass http://OrdinaryPolling;
11             index  index.html index.htm index.jsp;
12
13         }
14     }

  三、启动 nginx。然后在浏览器输入localhost 地址,观看页面变化:

  

②、基于比例加权轮询

  上述两台Tomcat服务器基本上是交替进行访问的。但是这里我们有个需求:

  由于Tomcat1服务器的配置更高点,我们希望该服务器接受更多的请求,而 Tomcat2 服务器配置低,希望其处理相对较少的请求。

  那么这时候就用到了加权轮询机制了。

  nginx.conf 配置文件如下:

 1     upstream OrdinaryPolling {2     server 127.0.0.1:8080 weight=5;3     server 127.0.0.1:8081 weight=2;4     }5     server {6         listen       80;7         server_name  localhost;8 9         location / {
10             proxy_pass http://OrdinaryPolling;
11             index  index.html index.htm index.jsp;
12
13         }
14     }

  其实对比上面不加权的轮询方式,这里在 upstream 指令中多了一个 weight 指令。该指令用于配置前面请求处理的权重,默认值为 1。

  也就是说:第一种不加权的普通轮询,其实其加权值 weight 都为 1。

  下面我们看页面相应结果:

  

  明显 8080 端口号出现的次数更多,试验的次数越多越接近我们配置的比例。

③、基于IP路由负载

  我们知道一个请求在经过一个服务器处理时,服务器会保存相关的会话信息,比如session,但是该请求如果第一个服务器没处理完,通过nginx轮询到第二个服务器上,那么这个服务器是没有会话信息的。

  最典型的一个例子:用户第一次进入一个系统是需要进行登录身份验证的,首先将请求跳转到Tomcat1服务器进行处理,登录信息是保存在Tomcat1 上的,这时候需要进行别的操作,那么可能会将请求轮询到第二个Tomcat2上,那么由于Tomcat2 没有保存会话信息,会以为该用户没有登录,然后继续登录一次,如果有多个服务器,每次第一次访问都要进行登录,这显然是很影响用户体验的。

  这里产生的一个问题也就是集群环境下的 session 共享,如何解决这个问题?

  通常由两种方法:

  1、第一种方法是选择一个中间件,将登录信息保存在一个中间件上,这个中间件可以为 Redis 这样的数据库。那么第一次登录,我们将session 信息保存在 Redis 中,跳转到第二个服务器时,我们可以先去Redis上查询是否有登录信息,如果有,就能直接进行登录之后的操作了,而不用进行重复登录。

  2、第二种方法是根据客户端的IP地址划分,每次都将同一个 IP 地址发送的请求都分发到同一个 Tomcat 服务器,那么也不会存在 session 共享的问题。

  而 nginx 的基于 IP 路由负载的机制就是上诉第二种形式。大概配置如下:

 1     upstream OrdinaryPolling {2     ip_hash;3     server 127.0.0.1:8080 weight=5;4     server 127.0.0.1:8081 weight=2;5     }6     server {7         listen       80;8         server_name  localhost;9
10         location / {
11             proxy_pass http://OrdinaryPolling;
12             index  index.html index.htm index.jsp;
13
14         }
15     }

  注意:我们在 upstream 指令块中增加了 ip_hash 指令。该指令就是告诉 nginx 服务器,同一个 IP 地址客户端发送的请求都将分发到同一个 Tomcat 服务器进行处理。

④、基于服务器响应时间负载分配

  根据服务器处理请求的时间来进行负载,处理请求越快,也就是响应时间越短的优先分配。

 1     upstream OrdinaryPolling {2     server 127.0.0.1:8080 weight=5;3     server 127.0.0.1:8081 weight=2;4     fair;5     }6     server {7         listen       80;8         server_name  localhost;9
10         location / {
11             proxy_pass http://OrdinaryPolling;
12             index  index.html index.htm index.jsp;
13
14         }
15     }

  通过增加了 fair 指令。

⑤、对不同域名实现负载均衡

  通过配合location 指令块我们还可以实现对不同域名实现负载均衡。

 1     upstream wordbackend {2     server 127.0.0.1:8080;3     server 127.0.0.1:8081;4     }5 6     upstream pptbackend {7     server 127.0.0.1:8082;8     server 127.0.0.1:8083;9     }
10
11     server {
12         listen       80;
13         server_name  localhost;
14
15         location /word/ {
16             proxy_pass http://wordbackend;
17             index  index.html index.htm index.jsp;
18
19         }
20     location /ppt/ {
21             proxy_pass http://pptbackend;
22             index  index.html index.htm index.jsp;
23
24         }
25     }

作者:YSOcean

出处:http://www.cnblogs.com/ysocean/

Nginx(四)------nginx 负载均衡相关推荐

  1. Nginx(四):负载均衡Load balancing

    1.概念基础 Load balancing,即负载均衡,是一种计算机技术,用来在多个计算机(计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载,以达到最优化资源使用.最大化吞吐率.最小化响 ...

  2. 五分钟让你搞懂Nginx负载均衡原理及四种负载均衡算法

    前言 今天这篇文章介绍了负载均衡的原理以及对应的四种负载均衡算法,当然还有对应的指令及实战,欢迎品尝.有不同意见的朋友可以评论区留言! 负载均衡 所谓负载均衡,就是 Nginx 把请求均匀的分摊给上游 ...

  3. Nginx 反向代理 负载均衡 虚拟主机

    Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...

  4. So easy!Nginx+SpringBoot 实现负载均衡

    在介绍Nginx的负载均衡实现之前,先简单的说下负载均衡的分类,主要分为硬件负载均衡和软件负载均衡,硬件负载均衡是使用专门的软件和硬件相结合的设备,设备商会提供完整成熟的解决方案,比如F5,在数据的稳 ...

  5. nginx+tomcat+memcached负载均衡

    2019独角兽企业重金招聘Python工程师标准>>> nginx+tomcat+memcached负载均衡 负载均衡: 负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服 ...

  6. [Nginx]nginx 配置实例-负载均衡

    nginx 配置实例-负载均衡 1.实现效果 (1)浏览器地址栏输入地址 http://192.168.111.134/edu/a.html,负载均衡效果,平均分担到 8080和 8081 端口中 2 ...

  7. Linux下Nginx+多Tomcat负载均衡实现详解

    一.简介 [Nginx] 大名鼎鼎,麻雀虽小五脏俱全,它拥有小而稳且高效的特性.为目前大多数中小企业所使用.nginx可以做以下几件事: 反向代理 负载均衡 动静分离 网页.图片缓存 [Tomcat] ...

  8. Nginx+Tomcat实现负载均衡、动静分离集群部署

    Nginx+Tomcat实现负载均衡.动静分离集群部署 一.Tomcat多实例部署 1.安装好jdk 2.安装tomcat 3.配置tomcat环境变量 4.修改tomcat2中的server.xml ...

  9. Nginx配置之负载均衡、限流、缓存、黑名单和灰度发布

    Nginx配置之负载均衡.限流.缓存.黑名单和灰度发布 一.Nginx安装(基于CentOS 6.5) 1.yum命令安装 yum install nginx –y (若不能安装,执行命令yum in ...

  10. Nginx配之负载均衡、缓存、黑名单和灰度发布

    一.Nginx安装(基于CentOS 6.5) 1.yum命令安装 yum install nginx –y (若不能安装,执行命令yum install epel-release) 2. 启动.停止 ...

最新文章

  1. 深度 | 容器规模化落地企业的最佳途径
  2. Java IO 之 InputStream源码
  3. web实现远程桌面:Apache Guacamole
  4. Mysql日期和时间函数大全
  5. php不发送referer,php – 注意:未定义的索引:HTTP_REFERER
  6. 第四期《Summer Tree》 已经整理完毕
  7. 云服务器一直显示启动中,云服务器一直启动代码
  8. 产品管理系列(一)---优秀的产品经理所具有的素质 王泽宾
  9. 前端基础--jquery
  10. 简易计算器--带小数点--单片机课程设计
  11. DirectShow介绍
  12. 区块链运营思路_区块链商业模式,及数字货币运营方案
  13. 【笔记】操作系统题目整理
  14. 《2022年Java开发者生产力报告》出炉啦
  15. 改名最成功的5所大学:改名如改命
  16. mysql8.017安装教程_mysql 8.0.17 安装图文教程
  17. Vue-纯前端导出word文档 Can‘t find end of central directory:is this a zip file?
  18. 1天1瓶啤酒 大脑衰老2年
  19. 计算机组成原理ACC中文含义,计算机组成原理 作业一
  20. 涨知识!原来中国南海岛礁竟有这么诗情画意的名字!

热门文章

  1. 大型网站架构技术一览
  2. Kafka设计解析(五):Kafka Benchmark--转
  3. funny alphabet
  4. mongdb开始标记
  5. Python数据结构与算法(第五天)
  6. Deep Learning Face Representation by Joint Identification-Verification
  7. aws iot 连接时间_AWS IoT Core 定价
  8. 关于Rocchio算法和向量空间模型反馈
  9. 一、【绪论】数据结构的基本概念
  10. 顺序表的应用——逆置问题