要理解正向和反向代理,
简单说就是要整明白到底代理服务器代理了谁后者说代理服务器为谁服务?
别急,一点点往下看。
一、正向代理
1、啥是正向代理
就是一个在客户端和目标服务器之间的服务器(称为代理服务器),帮助客户端从目标服务器获取内容。此时目标服务器是不知道访问自己的是真实的客户端还是客户端找的代理。
比如要访问国外网站,直接访问不通,那么就可以找一个代理服务器为我们服务,客户端发请求到代理服务器,代理服务器把请求转发到目标服务器让后把结果拿回来返回给客户端。
我靠,原来正向代理说白了就是代理服务器为客户端服务去访问目标服务器啊,那这玩意有啥用呢?
2、正向代理有啥用
(1)提高访问速度
代理服务器一般都会设置一个缓冲区,目的是将一些请求的响应保存起来,当有其他用户访问相同请求时,直接从缓冲区中拿出信息就好了,提高访问速度。
(2)突破访问限制
通过代理服务器可以突破客户端自身 IP 的访问限制,比如去访问国外网站等。
(3)隐藏真实IP
客户端可以用代理服务器隐藏自己的IP,目标服务器不知道,只知道代理服务器的 IP。
二、反向代理
1、啥是反向代理
理解了正向代理,反向代理就简单了。就反过来呗,代理服务器为目标服务器服务,代理服务器同样接收来自客户端的请求,然后把请求转发目标服务器,取得结果返回给客户端。此时客户端不知道自己访问的是真实的目标服务器还是代理服务器。
比如我们要访问百度网站,百度的代理服务器对外的域名为 https://www.baidu.com 。具体内部的服务器节点其实我们是不知道的。现实中其实我们是访问了百度的代理服务器,然后代理服务器转发请求到内部 N 多个的服务器节点中的一个,最后取得结果返回。
所以,反向代理,就是 “代理服务器” 代理了 “目标服务器”,去跟"客户端"交互,我靠,牛啊。那么问题来了,它有啥用?
2、反向代理有啥用
(1)提高访问速度
反向代理服务器也可以提供缓存服务以提高访问速度。
(2)隐藏服务器IP
正向代理隐藏客户端IP,反向代理可以对客户端隐藏服务器的IP。
(3)提供安全保障
反向代理服务器可以作为应用层防火墙,为网站提供防护功能。还可以有一些特殊的处理,比如为后端服务器统一提供加密、HTTP访问认证等。
(4)负载均衡
反向代理服务器能用于负载均衡,根据真实服务器的负载情况,将客户端请求根据策略分发到不同的真实服务器去处理。
三、负载均衡
1、为啥需要负载均衡
举个栗子,日常生活中火车站、电影院、银行等比较拥挤的场所一般都会设置多个服务点或入口。但是如果没有人引导,多数情况下,最近的入口就会挤满人,而距离较远的入口就宽松很多。这种情况下,就会大大浪费资源,因为如果把这些人合理的分散到各入口的话将大幅缩短排队等待的时间。
因此,网站的建设 道理一样。为了提升服务能力,大多网站采用集群部署,就好像火车站有多个入口一样。当大批用户集中访问网站时,如果没有任何机制来疏导限制,那么可能会导致某些服务器的流量很大,其他服务器流量很小。不仅浪费了资源,而且还会影响用户体验。更严重时可能直接拖垮流量大的服务器。
咋解决呢,此时就需要有一个协调者去均衡分配用户请求,目的就是可以分散服务器压力使得请求均匀被分配到不同的服务器上。
2、啥是负载均衡
上面已经说了,为提升网站服务能力,一般会把多台机器组成一个集群对外提供服务。但是,网站对外提供的访问入口都是同一个,比如 www.baidu.com。那么,当用户在浏览器输入www.baidu.com 时,如何将这些用户请求分发到集群中不同的机器上?这就是负载均衡要做的事。
3、负载均衡的几种实现方式
(1)HTTP 重定向
通过 HTTP 重定向服务器根据用户的 http 请求计算出一个真实的 web 服务器地址,然后把该地址写入http 重定向响应中返回给客户端浏览器,再由浏览器重新访问。
这种方式比较简单,但是浏览器要两次请求服务器才能完成一次访问取得结果,性能较差。
(2)DNS 域名解析
在 DNS 服务器上配置某个域名对应的多个 IP 的地址,每次域名解析请求时,会根据负载均衡算法计算一个不同的 IP 地址返回,这样配置的多个服务器构成一个集群, 可以实现负载均衡。
这种方式将负载均衡工作转交给 DNS,省去了网站管理负载均衡服务器的麻烦,但是网站无法对其做改善和管理,因为 DNS 负载均衡的控制权属于域名服务商。
(3)反向代理
反向代理服务器将用户请求根据负载均衡算法转发到不同的 Web 服务器上。Web 服务器将处理结果通过反向代理服务器返回给用户。由于反向代理服务器转发请求是在 HTTP 协议层面,因此也称为应用层负载均衡。
反向代理服务器部署简单,但是其作为请求和响应的中转站,性能可能会成为系统瓶颈。
(4)IP 负载均衡
在网络层通过修改请求目标的地址进行负载均衡。负载均衡服务器在操作系统内核进程获取用户请求的数据包,在根据负载均衡算法得到一个真实 Web 服务器地址,然后将这个请求数据的目的 IP 修改为通过计算得到的真实 Web 服务器 IP。真实 Web 服务器处理后会将响应数据给到负载均衡服务器,此时负载均衡服务器再将返回数据包的源地址修改为自身 IP 地址返给用户浏览器。
反向代理负载均衡是在应用程序中分发数据,而 IP 负载均衡在内核进程分发数据,因此处理性能更好。但是负载均衡服务器作为中转站,会成为集群的性能瓶颈(如吞吐量)。难以满足像提供下载服务或视频服务的需求(因为传输的数据量很大)。
那么能否让负载均衡服务器只负责分发请求,而响应数据让真实的服务器不通过负载均衡服务器而是直接返回给用户呢?这就要用到数据链路层负载均衡了
(5)数据链路层负载均衡
将真实的 web 服务器集群中所有机器的虚拟 IP 地址配置成和负载均衡服务器的 IP 相同,进而达到不修改数据包的源地址和目的地址就可以进行数据分发的目的。
也就是说,数据链路层负载均衡分发数据时只修改目的 MAC 地址,不修改目的 IP 地址,不需要通过负载均衡服务器进行地址交换,可直接将响应数据包返回给用户浏览器,避免了负载均衡服务器成为性能瓶颈。