正向代理与反向代理

    先问几个问题,什么事正向代理?什么是反向代理?两者又有啥区别呢?正向代理可以为我们做什么?反向代理又有什么作用呢?先前只知道反向代理,可是却忽略了正向代理。知识的学习没有全面,反思。下面图片部分整理学习来自网络,如有侵权请告诉我,谢谢啦。


    正向代理

    正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

    下面这张图很好的向我们解释了正向代理:
    正向代理示意图


    举个小例子

    简单的有个小例子:我们知道谷歌在国内被墙了,所以我们会去用vpn。vpn的作用就相当于一个代理服务器,使我们能够访问我们访问不了的网站。在这个过程中,我们知道有这样一个代理服务器存在,也知道访问谷歌也存在一个谷歌的服务器。这两个服务器的存在我们都很清楚。

    上面的图中,用户A主动请求要访问的服务器B,在图中我们可以看到A先访问了代理服务器Z,Z收到请求后,再发送给服务器B。然后再由服务器Z把数据返回给A。

    这个过程中,用户知道服务器B,也知道代理服务器Z,但这些所有的请求都是由代理服务器来处理的。


    正向代理能够帮助我们做什么

    做缓存,加速访问

    可以在代理服务器Z做缓存,比如用户已经访问过B服务器后,把数据又返回给了Z,Z把这些信息都存在了本地,做了缓存,那么下次A再访问B的时候,是不是就不需要通过多次转发,不需要经过很多路由,而直接用了Z呢?这样就是利用代理服务器加速访问的原理。

    正向代理缓存示意图


    翻墙原理

    刚刚提到了google那个例子,就是一个翻墙的常见实例。现在我们看下原理图。
    正向代理翻墙示意图


    服务器验证

    比如说我们可以采用代理服务器做一些验证,比如上网权限,因为互联网要先经过代理服务器。也是由于正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。

    整个来说,正向代理就像一个跳板,我们不能访问一个服务器,但我们可以访问代理服务器,这个代理服务器又可以访问,我们交给代理服务器去取数据,然后再返回给我。客户端必须要经过一些特别的设置才能使用正向代理。


    反向代理

    反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器

    反向代理与正向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。

    对外表现为一个服务器怎么理解?比如访问cailidan.cn的时候,大家是不知道我用了反向代理的。大家以为访问的就是这个,但实际上用了反向代理,这个时候我的nginx表现的就像一个服务器一样。

    反向代理服务器有两种模型,一种是作为内容服务器的替身,也可以作为内如服务器集群的负载均衡器。

    反向代理示意图


    反向代理的特点

    比如下图,用户A在访问B的资源的时候,并不知道中间还存在一个代理服务器,她一直以为请求的是原始服务器。但实际是反向代理服务器再接受了A的请求后,从原始B取得A的需求资源,并且发送给A。由于防火墙的作用,只允许代理服务器ZZ访问原始资源服务器B,尽管在这个环境下,真实的是由于防火墙和反向代理的共同作用保护了B,但是我们用户A并不知道。

    相当于正向代理是代理客户端而言,反向代理是代理服务器。

    反向代理示意图


    反向代理的用途

    代理服务器对外就表现为一个Web服务器,外部网络就可以简单把它当作一个标准的Web服务器而不需要特定的配置。不同之处在于,这个服务器没有保存任何网页的真实数据,所有的静态网页或者CGI程序,都保存在内部的Web服务器上。因此对反向代理服务器的攻击并不会使得网页信息遭到破坏,这样就增强了Web服务器的安全性


    负载均衡

    负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。均衡负载能够平均分配客户请求到服务器列阵,籍此提供快速获取重要数据,解决大量并发访问服务问题。

    简单的来说,就是当我们的http请求过多的时候,反向代理服务器负责分发http请求,来确保某一个服务器不会压力太大,然后崩掉。


    实现CDN

    刚刚我们知道了正向代理服务器可以实现缓存,从而加快访问的效果,那反向代理服务器也是一个代理服务器,那肯定也是拥有Cache功能的,它可以暖村原始资源服务器的资源,从而不是每次都要向原始资源服务器B请求数据,特别是一些静态的数据,比如图片和文件,如果这些反向代理服务器能够做到和用户X来自同一个网络,那么用户X访问反向代理服务器X,就会得到很高质量的速度。这正是CDN技术的核心。

    CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置反向代理节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。

    反向代理实现缓存和负载均衡示意图


    总结

    从安全上说

    • 正向代理允许客户端通过访问任意网站并且还隐藏客户端的身份,因此咱么必须要用安全的措施用来确保,并未经过授权的客户提供服务。
    • 反向代理对外是透明的,大家不知道自己访问的是一个代理服务器。

    从用途上总结

    • 正向代理主要是为防火墙内的局域网客户端提供internet访问途径,并且可以利用缓存来减少网络使用率。
    • 反向代理的主要用途是为后台服务器提供负载均衡或者为后端比较慢的服务器提供缓冲技术。并且还有一些更加高级的URL策略和管理技术。
    举个比方:正向代理就是有3个人,a是b的好朋友,b的好朋友是c,a有困难找了b,b不能解决就找了c。a他很清楚的知道b有个好朋友叫做c。就像我们用VPN翻墙,是知道必须买这个才行的。
    但是反向代理,也是一样的过程,区别就是a他不知道b有个好朋友c,而且b还向c寻求帮助。a以为他的忙就是b帮的。