转 https://www.zhihu.com/question/24723688
41 个回答
正向代理
A同学在大众创业、万众创新的大时代背景下开启他的创业之路,目前他遇到的最大的一个问题就是启动资金,于是他决定去找马云爸爸借钱,可想而知,最后碰一鼻子灰回来了,情急之下,他想到一个办法,找关系开后门,经过一番消息打探,原来A同学的大学老师王老师是马云的同学,于是A同学找到王老师,托王老师帮忙去马云那借500万过来,当然最后事成了。不过马云并不知道这钱是A同学借的,马云是借给王老师的,最后由王老师转交给A同学。这里的王老师在这个过程中扮演了一个非常关键的角色,就是代理,也可以说是正向代理,王老师代替A同学办这件事,这个过程中,真正借钱的人是谁,马云是不知道的,这点非常关键。
我们常说的代理也就是只正向代理,正向代理的过程,它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求,某些科学上网工具扮演的就是典型的正向代理角色。用浏览器访问 http://www.google.com 时,被残忍的block,于是你可以在国外搭建一台代理服务器,让代理帮我去请求google.com,代理把请求返回的相应结构再返回给我。
反向代理
大家都有过这样的经历,拨打10086客服电话,可能一个地区的10086客服有几个或者几十个,你永远都不需要关心在电话那头的是哪一个,叫什么,男的,还是女的,漂亮的还是帅气的,你都不关心,你关心的是你的问题能不能得到专业的解答,你只需要拨通了10086的总机号码,电话那头总会有人会回答你,只是有时慢有时快而已。那么这里的10086总机号码就是我们说的反向代理。客户不知道真正提供服务人的是谁。
反向代理隐藏了真实的服务端,当我们请求 www.baidu.com 的时候,就像拨打10086一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx就是性能非常好的反向代理服务器,用来做负载均衡。
两者的区别在于代理的对象不一样:正向代理代理的对象是客户端,反向代理代理的对象是服务端
不妨也关注一下公众号 Python之禅
很久以前,老王去饭店吃饭,需要先到饭店,七荤八素点好菜,坐等饭菜上桌,然后大快朵颐,不亦乐乎。
有了第三方订餐外卖平台(代理),老王懒得动身前往饭店,老王打个电话或用APP,先选好某个饭店,再点好菜,外卖小哥会送上门来。
由于某个品牌的饭店口碑特别好,食客络绎不绝涌入,第三方订餐电话也不绝于耳,但是限于饭店接待能力有限,无法提供及时服务,很多食客等得不耐烦了,纷纷铩羽而归,饭店老总看着煮熟的鸭子飞走了,心疼不已。
痛定思痛,老总又成立了几个连锁饭店,形成一个集群,对外提供统一标准的菜品服务,电话订餐电话400-xxx-7777,当食客涌入饭店总台,总台将食客用大巴运到各个连锁店,这样食客既不需要排队,各连锁店都能高速运转起来,一举两得,老总乐开了花,并为此种运作模式起名为“反向代理”(Reverse Proxy)。
反向代理
在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的接入请求蜂拥而入时,会造成服务器忙不过来的局面,可以使用多个服务器来共同分担成千上万的用户请求,这些服务器提供相同的服务,对于用户来说,根本感觉不到任何差别。
反向代理的实现
1)需要有一个负载均衡设备来分发用户请求,将用户请求分发到空闲的服务器上
2)服务器返回自己的服务到负载均衡设备
3)负载均衡将服务器的服务返回用户
以上的潜台词是:用户和负载均衡设备直接通信,也意味着用户做服务器域名解析时,解析得到的IP其实是负载均衡的IP,而不是服务器的IP,这样有一个好处是,当新加入/移走服务器时,仅仅需要修改负载均衡的服务器列表,而不会影响现有的服务。
谈完反向代理服务,再来谈谈终端用户常用的代理服务。
代理
1)用户希望代理服务器帮助自己,和要访问服务器通信,为了实现此目标,需要以下工作:
a) 用户IP报文的目的IP = 代理服务器IP
b) 用户报文端口号 = 代理服务器监听端口号
c) HTTP 消息里的URL要提供服务器的链接
2)代理服务器可以根据c)里的链接与服务器直接通信
3)服务器返回网页
4)代理服务器打包3)中的网页,返回用户。
代理服务器应用场景
场景一
如果不采用代理,用户的IP、端口号直接暴露在Internet(尽管地址转换NAT),外部主机依然可以根据IP、端口号来开采主机安全漏洞,所以在企业网,一般都是采用代理服务器访问互联网。
那有同学会有疑问,那代理服务器就没有安全漏洞吗?
相比千千万万的用户主机,代理服务器数量有限,修补安全漏洞更方便快捷。
场景二
在一个超大型局域网,德高望重的家长觉得小盆友们“幼稚”、“有时还有点单纯”,外部的世界是洪水猛兽,为了不让小盆友们学坏,决定不让小盆友们访问一些网站,可小盆友们有强烈的逆反心理,侬越是不让我看,我越是想看,于是小盆友们使用了代理服务器,这些代理服务器将禁止访问的网页打包好,然后再转交给小盆友,仅此而已。
正向代理中,proxy和client同属一个LAN,对server透明;
反向代理中,proxy和server同属一个LAN,对client透明。
实际上proxy在两种代理中做的事都是代为收发请求和响应,不过从结构上来看正好左右互换了下,所以把后出现的那种代理方式叫成了反向代理。
所谓反向代理基本上就是一个服务端的负载均衡器。很好奇java界总喜欢弄一些新名词。。莫名其妙。语言是用来交流的,不是用来装逼的。有兴趣的可以追根溯源一下这个名词的出处。我理解就是写apache文档那个人造出来的。然后一帮人不理解这个反人类的名词。然后理解了的自以为得意经常面试考,看到这个名词的人以为逼格很高然后不知怎么的这个名词就”流行“起来。我对这个名词的想法是跟UML一样,属于反人类的范畴,如果你不理解,完全可以。碰到别人说到这个名词,你不理解就问他是什么就行了。
=====================更正=======================据我最新考据,这个词语最早的出处应该是Sun公司2004年出的这本书
Securing Web Applications through a Secure Reverse Proxy
不清楚作者新造一个名词的想法是什么。目前也查不出是哪个家伙发明这个反人类名词的。
处于同一位置的负载均衡器的feature可完全包含所谓的反向代理。
Load balancing (computing)
如果想用正向代理的方式访问百度的话,那我们得这样做:
1、自己搭一个或者找一个代理服务器
2、将上一步得到的代理服务器,在系统中设置好,windows中是这样设置的
127.0.0.1是我的代理服务器的ip,8888是我的代理服务器的端口。
3、然后访问http://baidu.com,这样的话代理服务器就会开始工作了,首先你访问百度的请求会发送到代理服务器上,然后代理服务器就会听你的话,去http://baidu.com把东西给拿回来,然后放在自己的服务器上面,之后你就从代理服务器上拿走,返回给自己电脑。
这里的要点是:
客户端没有直接和服务端(http://baidu.com)接触,而是通过代理服务器(127.0.0.1:8888)间接访问,数据也是从代理服务器上直接拿的。
我们访问的 http://baidu.com,然后从这个服务器拿到的资源,其实可能这些资源并不是从这个服务器里拿出来的,而是这个服务器作为反向代理,从别的服务器拿过来的。
你以为你是这样访问百度的
而实际上你是这么访问百度的
所以我们用反向代理,这个反向代理就相当于一个统筹资源的作用
一个是代理(v)服务器,为服务器收发请求,使真实服务器对客户端不可见。
因为服务对象和自身角色不同,所以刚好是相反的。
(v代表动词)
至于负载均衡,CDN都是反向代理的应用,但他们都不代表反向代理,所以反对一下某些高票答案,低票答案比高票靠谱多了。
服务的目标不同。
普通代理,forward proxy,是服务于特定用户(比如说一个公司内 / 一个局域网内的客户)以访问非特定的服务;反向代理,reverse proxy,是服务于非特定用户(对于公开互联网服务而言,通常是所有用户)以访问特定的服务。
我们常说的代理是正向代理。使用正向代理的过程如下:
1,客户端连接代理。
2,代理连接服务器。
3,服务器将结果发给代理。
4,代理将结果发给客户端。
反向代理的过程如下:
1,客户端连接服务器,其实连接的是反向代理服务器,但是客户端不知道。
2,反向代理将请求转发给相应的服务器。
3,服务器将结果发给反向代理。
4,方向代理将结果发给客户端。
流程基本一样,主要是反向代理是和服务器部署在一起,如nginx,haproxy,但客户端不知道反向代理的存在。反向代理知道服务器集群的情况,知道怎么转发请求给具体的服务器。而正向代理只能转发给相应的域名对应的服务器。反向代理因为和服务器部署在一起,所以可以用来做负载均衡,对客户端请求进行各种处理(如统计连接数,拒绝连接等)等等。
主要记住,反向代理是和服务器集群在一起的,并且知道集群的内部情况。
正向代理中proxy代理client来向一个server发起请求.
主要用途:
防火墙的作用, 让所有对一个服务器发起的请求中间加一个中间层, 方便做一些拦截, 屏蔽什么的.
而反向代理中proxy代理一个或者多个server接收clients的请求, server对于client来说是不可见的
用途:
1. 内容分发网络CDN, 通过反向代理把请求分发到世界各地的服务器去, 提升访问速度.
2. 大公司不想暴露自己主服务器的位置.
可以参考一个StackOverflow上很棒的答案:
webserver - Difference between proxy server and reverse proxy server
反向代理正好反过来了,c请求s,c其实不知道先经过了p,而s恰恰知道请求是由p转送过来。
比如browser,nginx,php-fpm,php-fpm知道请求不是browser直接过来的,是通过某个p过来,虽然不一定知道那个p是nginx,而browser却不知道它的请求是先到了nginx再到php-fpm
有X,Y,Z三台,X想访问Z,Y是代理服务。
正向代理:X知道Z,可能也知道Y,X的request被Y截获,然后以Y的名义去访问Z,把结果返回,这个过程Y是代理X的。
反向代理:X不知道Z,X知道Y的存在,request到Y之后,实际Y回去访问Z,把结果返回,这个过程Y是代理Z的。
很多时候都是正向代理,反向代理的服务一般就是load balancer,web 加速等。
正或反就是看代理的是client还是server。
我们看到的术语都翻译自英文,理解反向代理从英文入手也是一个好思路。
理解反向代理(Reverse Proxy)之前首先要明白什么是正向代理(Proxy)
代理 Proxy 翻译:a person(代理) authorized to act for another (代理的对象)
一般的代理(正向)的代理对象是:请求方,让你做什么你就代它做什么。
反向代理即代理服务方,替服务端做事。服务端的服务它全代理了。
Proxy 正向代理: act as a client
Reverse Proxy 反向代理: act as a server
总结一下:
正向代理:代理客户端,将客户端的请求 等价 转发请求到服务端,代理机不了解服务端任何情况
反向代理:代理服务端,代替服务端接收服务,代理机需要与服务端建立映射关系(配置)
正向代理:客户端发起的请求,通过代理服务器,转发给服务器,然后再把服务器返回的内容,转交给客户端。这种服务器只响应代理服务器请求的模式,就是正向代理模式。
反向代理:客户端发起的请求,被一台总代理服务器分发给不同的服务器,交由不同的服务器响应。这种客户端不知道是由哪一台服务器响应它的请求的模式,即使反向代理模式。
正向代理(客户):重点在于体现代理商代理1个商户(产品)为N个客户服务,代理商侧重为多个客户服务(eg.HTTP代理为多个人提供翻墙服务);
反向代理(商户):重点在于体现代理商代理N个商户(产品)为某1客户服务,代理商侧重为多个商户服务(eg.百度外卖为多个商户提供平台给某个用户提供外卖服务)。
站的角度同一样,称呼可能就不一样.
给客户端代理叫(正向)代理
例如用vpn,本来客户端直接访问一些网页,现在像google等访问不了,vpn代理客户端请求,访问google。
给服务器端做代理叫反向代理
例如nginx,本来服务器tomcat,jetty能直接让用户请求访问,但是它们选择让nginx作为自己的代理,让用户线请求nginx,再转发到它们上面。
反向并不表明什么东西反向,只是请求的两端名称而已,用以区别代理的是哪个端!
不知道,对于有没有人对这种情况有疑问的,如:一个墙外的nginx服务器是个一个反向代理,想要去访问该服务器,却需要一个正向代理。这种情况会不会出现,如果出现的话,需要注意什么呢?
In computer networks, a reverse proxy is a type of proxy server that retrieves resources on behalf of a client from one or more servers. These resources are then returned to the client as though they originated from the proxy server itself.
While a forward proxy acts as an intermediary for its associated clients to contact any server, a reverse proxy acts as an intermediary for its associated servers to be contacted by any client.
Quite often, popular web servers have also some reverse-proxying functionality, acting as shields for application frameworks with weaker HTTP capabilities.
来自Wikipeida的定义。简单明了。