正向代理与反向代理

正向代理与反向代理

本篇内容主要素材来自知乎问题:反向代理为何叫反向代理? - Nginx - 知乎


缘起

自从接触了 Nginx 之后,就一直听到这样的话:

Nginx 是一个高性能的 HTTP 和反向代理服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器。

问题来了,什么是「反向代理」,既然有反向,是不是就有「正向代理」?



首先了解代理

代理本质上是一个服务器,可以类比为一个中介,A 和 B 本来可以直连,中间插入一个 C,C 就是中介。拿买房举个例子,买家和卖家原本可以直接交流,但如果卖家把卖房事宜委托给中介后,买家都只能先通过中介来联系卖家,再由中介转述回买家。



先说正向代理

我们常说的代理服务器(多指 VPN),一般就是正向代理。它的特点有:

隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都由代理服务器代替来请求

举个例子,国内的用户想要访问 Google 时,会被阻挡。所以这个时候把请求发送到另外一个代理服务器(可以访问 Google 的服务器)上,由其代为转发请求和接收响应内容。

结合实际工作场景举个例子:很多时候希望通过手机(请求客户端)访问电脑开发环境的内容(内容类比 Google 首页),可以在 PC 中搭建服务器(代理服务器),然后创建热点,手机设置 HTTP 代理(PC 的 IP 和端口),就可以访问到想要看的内容了。

当出现多个请求客户端时,是这样的:

总结一下,用最简单粗暴的说法:「正向代理」指一对一或多对一,Server 不知道请求的 Client 都是哪些人。



再说反向代理

反向代理恰好跟正向代理相反。同时反向代理一般是负载均衡的一个原理。按照上面所说,正向代理是一对一或多对一,那么反向代理就是一对多,画图说明:

什么场景会用到呢?拿打客服电话举个例子:有天不小心 QQ 被盗,你气急败坏的打电话给客户热线,你打的这个电话是总线,最终会分配给具体某位客服 MM 来处理。这个时候总线就是我们的「反向代理」,它的作用体现在当有 100 个人同时打进总线的时候,能够合理的分配空闲的客服 MM 来对接,这也是负载均衡的概念。大部分访问量大的网站,如百度,都会做负载均衡,其中反向代理服务器起着至关重要的角色。所以你也可以猜测反向服务器对应高并发的能力也必须很强(这就是为什么 Node 会作为一个反向代理服务器的后台语言之一)。

反向代理隐藏了真实的服务端,当我们请求 baidu.com 的时候,就像拨打 QQ 客服热线一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。

当然,除了一对多,还有多对多(很多用户同时访问同一个网站):



最后总结

两者的区别在于代理的对象不一样:正向代理代理的对象是客户端,反向代理代理的对象是服务端。

编辑于 2017-03-11

文章被以下专栏收录