说到负载均衡,很多人可能第一个想到的就是Nginx和Spring Cloud Ribbon,但是对于服务端的更多熟悉的是Nginx,今天我们站在开发者的角度来稍微详细的介绍下Nginx,通过这篇文章,我们可以了解到:
- Nginx是做什么的
- Nginx的正向代理和反向代理、反向代理中几种常见的负载均衡算法
- 和其他负载均衡项目的对比
目录:
一、Nginx概要
是什么:
Nginx俄罗斯的工程师Igor Sysoev用C语言开发出来的轻量级高并发服务器。基于 REST 架构风格,以统一资源描
述符(Uniform Resources Identifier)URI 或者统一资源定位符(Uniform Resources Locator)URL 作为沟通
依据,通过 HTTP 协议提供各种网络服务。Nginx可以做的事情有:
1.web服务器
2.负载均衡(反向代理)
3.web cache (web缓存)
优点有,
1.高并发。静态小文件
2.占用资源少。2万并发、10个线程,内存消耗几百M。
3.功能种类比较多。web,cache,proxy。每一个功能都不是特别强。
4.支持epoll模型,使得nginx可以支持高并发。
5.nginx 配合动态服务和Apache有区别。(FASTCGI 接口)
6.利用nginx可以对IP限速,可以限制连接数。
7.配置简单,更灵活。
应用场景有:
1.静态服务器。(图片,视频服务)另一个lighttpd。并发几万,html,js,css,flv,jpg,gif等。
2.动态服务,nginx——fastcgi 的方式运行PHP,jsp。(PHP并发在500-1500,MySQL 并发在300-1500)。
3.反向代理,负载均衡。日pv2000W以下,都可以直接用nginx做代理。
4.缓存服务。类似 SQUID,VARNISH。
Nginx 和Apache相比,它作为 Web 服务器一直为 Rambler Media 提供出色而又稳定的服务。然后又代码开源,并且赋予自由软件许可证。Apache不支持高并发但是Nginx支持高并发,Nginx配置简单,又是轻量级的,大多数人将Nginx 可以作为反向代理进行负载均衡的实现。
二、Nginx详解
正向代理和反向代理:
服务器代理可以理解为设计模式中的代理模式,就是一个代表一个渠道,可能提供了增强功能。涉及到两个角色一个是被代理角色,一个是目标角色。
理解反向代理,首先要了解什么是正向代理,正向代理代理的事客户端,它的特点是:
1.客户端非常明确要访问的服务器地址;
2.服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;
3.正向代理模式对于服务器来说屏蔽或者隐藏了真实客户端信息。
而且正向代理可能还会要求客户端做过多的设置,如设置需要访问的代理服务器端口等,类似于VPN的配置。
总结来说:正向代理,”它代理的是客户端”,是一个位于客户端和原始服务器(Origin Server)之间的服务器,为
了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器)。然后代理向原始服务器转交请
求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。它的用途有:访问原来无
法访问的资源,如 Google。可以做缓存,加速访问资源。对客户端访问授权,上网进行认证。代理可以记录用户
访问记录(上网行为管理),对外隐藏用户信息。
反向代理:
了解了正向代理之后,我们可以描述反向代理代理的是服务器。比如在目前分布式部署横行的今天,某讯多台
分布式服务器不适合每台都面对客户端来访问,那么在假设反向代理服务器后,多个客户端给服务器发送的请求,
Nginx 服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。它的作用是:
1.对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。
2.隐藏了服务器信息,客户端直接对接的是代理服务器。
3.保证内网的安全,通常将反向代理作为公网访问地址,Web 服务器是内网。
4.负载均衡,通过反向代理服务器来优化网站的负载。
它们之间的区别可以用一张图说明:
图解:在正向代理中,Proxy 和 Client 同属于一个 LAN(图中方框内),隐藏了客户端信息。在反向代理中,
Proxy 和 Server 同属于一个 LAN(图中方框内),隐藏了服务端信息。实际上,Proxy 在两种代理中做的事情都
是替服务器代为收发请求和响应,不过从结构上看正好左右互换了一下,所以把后出现的那种代理方式称为反向代
理了。
常见负载均衡的算法:
刚才我提到,反向代理服务器需要根据不同的算法把客户端的请求分发到各服务器,那么它具体有哪些负载均
衡算法呢。根据不用的项目应用场景,分发的规则是可以控制的。这里提到的客户端发送的、Nginx 反向代理服务
器接收到的请求数量,就是我们说的负载量。请求数量按照一定的规则进行分发,到不同的服务器处理的规则,就
是一种均衡规则。
负载均衡在实际项目操作过程中,有硬件负载均衡和软件负载均衡两种,硬件负载均衡也称为硬负载,如 F5 负
载均衡,相对造价昂贵成本较高;适合土豪企业或者服务器不多的小企业,它的好处是数据的稳定性安全性等等有
非常好的保障。但是更多的企业考虑到成本的原因会选择使用软件负载均衡。
Nginx 支持的负载均衡调度算法方式如下:
1.weight 轮询(默认):
接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会
自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个
权重值(weight),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,
主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。
2.ip_hash:
源地址哈希算法的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列
表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地
址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问;这样就解决了session共
享的问题。
3.fair:
比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均
衡,也就是根据后端服务器的响应时间 来分配请求,响应时间短的优先分配。Nginx本身不支持fair,他需要和第
三方插件配合使用,如果需要这种调度算法,则必须安装upstream_fair模块。
4.url_hash:
按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的
效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。
三、常见负载均衡框架对比
Ribbon:
Ribbon 是从 eureka 注册中心服务器端上获取服务注册信息列表,缓存到本地,然后在本地实现轮询负载均衡
策略。即在客户端实现负载均衡。Ribbon 适合与在微服务中 RPC 远程调用实现本地服务负载均衡,比如
Dubbo、SpringCloud 中都是采用本地负载均衡。
LVS:
。。。