Nireus 2019-11-09
在介绍反向代理之前,先看一下什么是正向代理
正向代理(forward proxy):是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。
这种代理其实在生活中是比较常见的,比如科学上网技术,其用到的就是代理技术。
有时候,用户想要访问某国外网站,该网站无法在国内直接访问,但是我们可以访问到一个代理服务器,这个代理服务器可以访问到这个国外网站。这样呢,用户对该国外网站的访问就需要通过代理服务器来转发请求,并且该代理服务器也会将请求的响应再返回给用户。这个上网的过程就是用到了正向代理。
这个过程其实和租房子很像。
租房子的时候,一般情况下,我们很难联系到房东,因为有些房东为了图方便,只把自己的房屋信息和钥匙交给中介了。而房客想要租房子,只能通过中介才能联系到房东。而对于房东来说,他可能根本不知道真正要租他的房子的人是谁,他只知道是中介在联系他。这里面一共有三个角色,租客(用户)、中介(代理服务器)和房东(国外网站,目标服务器)。引入中介(代理服务器)的原因是用户无法联系上房东(用户无法访问国外网站)。
所以,正向代理,其实是"代理服务器"代理了"客户端",去和"目标服务器"进行交互。通过正向代理服务器访问目标服务器,目标服务器是不知道真正的客户端是谁的,甚至不知道访问自己的是一个代理(有时候中介也直接冒充租客)。
通过代理服务器,可以突破自身IP访问限制,访问国外网站,教育网等。即,租客可以通过中介,来解决无法联系上房东的问题。
通常代理服务器都设置一个较大的硬盘缓冲区,会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度。即,中介手里留存了很多房源信息和钥匙,可以直接带租客去看房。
上网者也可以通过这种方法隐藏自己的IP,免受攻击。即,房东并不知道租客的真实身份。PS:但是中介知道了,可能骚扰更多….
反向代理(reverse proxy):是指以代理服务器来接收internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就变现为一个反向代理服务器。
再来看反向代理,继续以租房作类比:
我们在租房子的过程中,除了有些房源需要通过中介以外,还有一些是可以直接通过房东来租的。用户直接找到房东租房的这种情况就是我们不使用代理直接访问国内的网站的情况。
还有一种情况,就是我们以为我们接触的是房东,其实有时候也有可能并非房主本人,有可能是他的亲戚、朋友,甚至是二房东。但是我们并不知道和我们沟通的并不是真正的房东。这种帮助真正的房主租房的二房东其实就是反向代理服务器。这个过程就是反向代理。
对于常用的场景,就是我们在Web开发中用到的负载均衡服务器(二房东),客户端(租客)发送请求到负载均衡服务器(二房东)上,负载均衡服务器(二房东)再把请求转发给一台真正的服务器(房东)来执行,再把执行结果返回给客户端(租客)。
所以,反向代理,其实是"代理服务器"代理了"目标服务器",去和"客户端"进行交互。
通过反向代理服务器访问目标服务器时,客户端是不知道真正的目标服务器是谁的,甚至不知道自己访问的是一个代理。
使用反向代理,可以对客户端隐藏服务器的IP地址。
即,租客并不房东知道的真实身份。
反向代理服务器可以做负载均衡,根据所有真实服务器的负载情况,将客户端请求分发到不同的真实服务器上。
即,二房东发现房主本人很忙,于是找到房主的妻子帮忙处理租房事宜。
反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度。
即,二房东同样有房屋信息和钥匙。
反向代理服务器可以作为应用层防火墙,为网站提供对基于Web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等。还可以为后端服务器统一提供加密和SSL加速(如SSL终端代理),提供HTTP访问认证等。
即,二房东可以有效的保护房东的安全。
虽然正向代理服务器和反向代理服务器所处的位置都是客户端和真实服务器之间,所做的事情也都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端,但是二者之间还是有一定的差异的。
Load balancing,即负载均衡,是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
我们在日常生活中经常免不了要去一些比较拥挤的地方,比如地铁站、火车站、电影院、银行等。其实,根据我们的经验,无论是买票,还是排队入场,这些场所一般都会设置多个服务点或者入口的。
但是,如果没有人引导的话,大多数情况下,最近的入口会挤满人。而哪些距离较远的服务点或者入口就宽松很多。
这种情况下,就会大大浪费资源,因为如果可以把这些排队的人很好的分散到各个入口的话会大大缩短排队时间。
其实,网站的建设也是一样的。为了提升网站的服务能力,很多网站采用集群部署,就像话剧院有多个入口一样。
而当用户集中访问网站的时候,如果没有任何机制来疏导用户的话,完全随机或者就近原则的话,那么就会导致某些服务器的流量很大,而另外一个服务器的qps很小。这不仅严重的浪费了资源,而且还会导致拉长用户访问网站的RT,影响用户的体验。更严重的可能直接拖垮那些流量大的服务器。
这时候,就需要一个协调者,来均衡的分配这些用户的请求,可以让用户的可以均匀的分派到不同的服务器上。
前面提到过了,为了提升网站的各方面能力,我们一般会把多台机器组成一个集群对外提供服务。然而,我们的网站对外提供的访问入口都是一个的,比如www.taobao.com
。那么当用户在浏览器输入www.taobao.com
的时候如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡在做的事情。
负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。
想要实现负载均衡,其实有很多种做法,在深入介绍负载均衡之前,要先介绍一个概念,那就是OSI七层模型。
OSI是一个开放性的通信系统互连参考模型,它是一个定义得非常好的协议规范。
OSI模型有7层结构,每层都可以有几个子层。 OSI的7层从上到下分别是 7、应用层;6、表示层;5、会话层;4、传输层;3、网络层;2、数据链路层;1、物理层;
其中高层(即7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端的数据流。
在这七层模型种,高层次都是依赖于低层次的。层次越高,使用起来越方便。
我们经常听到的一些和计算机网络有关的概念中:
telnet、HTTP、FTP、NFS、SMTP、DNS等属于第七层应用层的概念。<br/>
TCP、UDP、SPX等属于第四层传输层的概念。<br/>
IP、IPX等属于第三层网络层的概念。<br/>
ATM、FDDI等属于第二层数据链路层的概念。<br/>
了解了网络协议的七层模型以后,再来看看负载均衡。我们可以很明确的一点是,负载均衡是要在网络传输中做文章的。而要在网络传输过程搞事情,那么这七层模型就势必躲不开。
所以,根据负载均衡技术实现在OSI七层模型的不同层次,是可以给负载均衡分类的。
常见的实现方式中,主要可以在应用层、传输层、网络层和数据传输层做文章。所以,工作在应用层的负载均衡,我们通常称之为七层负载均衡、工作在传输层的我们称之为四层负载均衡。
大致可以分为以下几种,其中最常用的是四层和七层负载均衡:
负载均衡服务器对外依然提供一个VIP(虚IP),集群中不同的机器采用相同IP地址,但是机器的MAC地址不一样。当负载均衡服务器接受到请求之后,通过改写报文的目标MAC地址的方式将请求转发到目标机器实现负载均衡。
和二层负载均衡类似,负载均衡服务器对外依然提供一个VIP(虚IP),但是集群中不同的机器采用不同的IP地址。当负载均衡服务器接受到请求之后,根据不同的负载均衡算法,通过IP将请求转发至不同的真实服务器。
四层负载均衡工作在OSI模型的传输层,由于在传输层,只有TCP/UDP协议,这两种协议中除了包含源IP、目标IP以外,还包含源端口号及目的端口号。四层负载均衡服务器在接受到客户端请求后,以后通过修改数据包的地址信息(IP+端口号)将流量转发到应用服务器。
七层负载均衡工作在OSI模型的应用层,应用层协议较多,常用http、radius、dns等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个Web服务器的负载均衡,除了根据IP加端口进行负载外,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。
市面上有很多开源的负载均衡的工具或软件,基本都是基于前面提到的方案实现的,大多数是工作在第七层和第四层的。Nginx/LVS/HAProxy 是目前使用最广泛的三种负载均衡软件。
LVS(Linux Virtual Server),也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目。使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。
LVS主要用来做四层负载均衡。
Nginx(发音同engine x)是一个网页服务器,它能反向代理HTTP, HTTPS, SMTP, POP3, IMAP的协议链接,以及一个负载均衡器和一个HTTP缓存。
Nginx主要用来做七层负载均衡。
HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy主要用来做七层负载均衡。
负载均衡服务器在决定将请求转发到具体哪台真实服务器的时候,是通过负载均衡算法来实现的。负载均衡算法,是一个负载均衡服务器的核心。
就像电影院门口的引导员一样,他根据什么把排队人员分配到具体的入口呢?是哪个入口人少吗?还是哪个入口速度最快?还是哪个入口最近呢?如果来了一个VIP怎么办呢?
负载均衡算法可以分为两类:静态负载均衡算法和动态负载均衡算法。
静态负载均衡算法包括:轮询,比率,优先权
动态负载均衡算法包括: 最少连接数,最快响应速度,观察方法,预测法,动态性能分配,动态服务器补充,服务质量,服务类型,规则模式。
以上,就是目前实现负载均衡的主流算法。不同的负载均衡服务器会选择不同的算法。就像电影院和火车站可能会选用不同的引导策略一样。火车站可能会把行李少的旅客分配到一个专门的入口,可能给即将发车的旅客分派到特快入口,手持可扫描车票的用户单独分配到特殊入口等。
某些公司会墙特定网站,如果你有一个可访问的域名和服务器,就可以通过nginx反向代理来来解决这些问题。比如现在我们用mirror.example.com镜像www.baidu.com,以下是详细操作。