反向代理为何叫反向代理?
146 个回答
正向代理
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之禅
正向代理(Proxy)在网络上是用来代理客户端(Client)的,而反向代理(Reverse Proxy)在网络上是用来代理服务端(Server)的。
至于凭什么代理Client就是"正向",代理Server就是”反向"这个问题,我做了一番调研也没有找到什么有用的结果......LOL(但是回答最后我会给出一个自己的猜测)
下面特别粗略地解释一下Proxy和ReverseProxy的代理究竟是怎么运作的,以及为什么要加代理。
通常情况下,咱们作为客户端(Client),访问网络上的资源,都是发送请求到互联网(Internet),之后导向相应的服务端(Server)获取资源。
什么是正向代理(Proxy)?
正向代理(Proxy),就是指在Client和Internet之间加一个中间服务,这个服务作为Client的代理人,拦截所有Client发出去的通讯,以代理人的身份再统一发出,从而代表Client和Internet进行交流,避免Client和Internet的直接交流。
这样加上一个正向代理(Proxy)的好处是什么呢?
- Proxy可以隐藏Client的IP, 暴露出去只是Proxy自己的IP,从而保护Client的隐私安全。
- Proxy可以作为缓存,当有相同资源的请求时,可以直接返回缓存内容,提高响应速度。
- Proxy可以作为过滤,限制或者阻断访问Internet上面一些特定内容。
- Proxy可以作为跳板(比如VPN),访问一些被防火墙或者网络区域限制的内容。
什么是反向代理(Reverse Proxy)?
反向代理(Reverse Proxy), 就是指在Internet和Web Server之间加上一个中间服务,这个服务作为Web Server的代理人,拦截所有发给Web Server的请求,然后再统一分发给代理的Web Servers, 避免Internet网络流量直接发给Web Server.
这样加上一个反向代理(Reverse Proxy)有什么好处呢?
- ReverseProxy可以隐藏WebServerIP, 只有反向代理的IP暴露网络, 从而保护WebServer。
- ReverseProxy可以作为LoadBalancer,合理分配流量到集群里的WebServer。
- ReverseProxy可以作为网站静态内容的缓存,大大提高响应速度并减轻WebServer负担。
- ReverseProxy可以代为处理SSL加密(计算量较大),减轻WebServer的负担。
一些杂谈与工程实践经验
ReverseProxy还有一个比较有意思的功能就是可以作为GlobalServerLoadBalancer,区别于普通的流量分配的LoadBalancer, GlobalServerLoadBalancer的作用更多是让不同地域的人访问网站会更快。大型网站(比如Netflix, Google, Amazon etc),会在全世界各个地方部署ReverseProxy,然后把相应区域的流量导到地理位置更近的Web Server,从而提供更快速的响应服务。
Nginx应该是最常见的反向代理服务器之一了,如果你从事Web相关的开发工作,一定对这个报错非常熟悉LOL。
在网络架构的工程实践上,如果一个私有网络想要访问其他网络的资源,那么一般需要给私有网络加上一个正向代理(Proxy)。如果一个私有网络想要被其他网络访问,那么一般需要给私有网络加上一个反向代理(Reverse Proxy),或者API Gateway(本身也可以算作一种Reverse Proxy)。
为啥代理Client就是"正向",而代理Server就是"反向"呢?
我的猜测是这个正反方向是指的请求的方向:Client的代理请求是向外发出的,直观理解上可能更靠近正向;Server的代理请求是向内接收的,直观上理解可能更靠近反向。当然,这个也基本上属于个人推测......实际上这个也不重要。咱们只需要知道正向代理代理的是Client,反向代理代理的是Server就够了。
很久以前,老王去饭店吃饭,需要先到饭店,七荤八素点好菜,坐等饭菜上桌,然后大快朵颐,不亦乐乎。
有了第三方订餐外卖平台(代理),老王懒得动身前往饭店,老王打个电话或用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、端口号来开采主机安全漏洞,所以在企业网,一般都是采用代理服务器访问互联网。
那有同学会有疑问,那代理服务器就没有安全漏洞吗?
相比千千万万的用户主机,代理服务器数量有限,修补安全漏洞更方便快捷。
场景二
在一个家庭局域网,家长觉得外部的世界是洪水猛兽,为了不让小盆友们学坏,决定不让小盆友们访问一些网站,可小盆友们有强烈的逆反心理,侬越是不让我看,我越是想看,于是小盆友们使用了代理服务器,这些代理服务器将禁止访问的网页打包好,然后再转交给小盆友,仅此而已。
当然关键的关键是代理服务器不在禁止名单当中!
2018.08.17文章更新于公众号,欢迎阅读:
精辟,正向代理隐藏真实客户端,反向代理隐藏真实服务端,一下就懂了,很有帮助
为
阿笠硕士的答案补图
上面的答案都说的很好,我画了张图能更直观地解释为何反向代理叫“反向“代理
正向代理中,proxy和client同属一个LAN,对server透明;
反向代理中,proxy和server同属一个LAN,对client透明。
实际上proxy在两种代理中做的事都是代为收发请求和响应,不过从结构上来看正好左右互换了下,所以把后出现的那种代理方式叫成了反向代理。
欢迎指正,以上。
先说正向代理,比如要访问youtube,但是不能直接访问,只能先找个翻墙软件,通过翻墙软件才能访问youtube. 翻墙软件就叫做正向代理。
所谓的反向代理,指的是用户要访问youtube,但是youtube悄悄地把这个请求交给x-art来做,那么x-art就是反向代理了。
正向代理代理客户端,反向代理代理服务器
代理其实就是一个中介,A和B本来可以直连,中间插入一个C,C就是中介。刚开始的时候,代理多数是帮助内网client访问外网server用的(比如HTTP代理),从内到外。后来出现了反向代理,"反向"这个词在这儿的意思其实是指方向相反,即代理将来自外网client的请求forward到内网server,从外到内。
所谓反向代理基本上就是一个服务端的负载均衡器。很好奇java界总喜欢弄一些新名词。。莫名其妙。语言是用来交流的,不是用来装逼的。有兴趣的可以追根溯源一下这个名词的出处。我理解就是写apache文档那个人造出来的。然后一帮人不理解这个反人类的名词。然后理解了的自以为得意经常面试考,看到这个名词的人以为逼格很高然后不知怎么的这个名词就”流行“起来。我对这个名词的想法是跟UML一样,属于反人类的范畴,如果你不理解,完全可以。碰到别人说到这个名词,你不理解就问他是什么就行了。
=====================更正=======================
据我最新考据,这个词语最早的出处应该是Sun公司2004年出的这本书
Securing Web Applications through a Secure Reverse Proxy不清楚作者新造一个名词的想法是什么。目前也查不出是哪个家伙发明这个反人类名词的。
处于同一位置的负载均衡器的feature可完全包含所谓的反向代理。
Load balancing (computing)更新回答来一波————————————————————————
要说清楚什么是反向代理,我们就需要先从最简单的C/S架构说起,C/S架构,也即是Client-Server的架构。而最简单的C/S架构,也即是以单个节点作为后端Server的C/S架构。
C/S架构中的单点Server
在普通的开发当中,单点Server的服务方式非常常见,比如使用Django框架做后台服务的时候,就可以通过简单的run server命令运行起一个临时的服务,接着通过地址就可以访问到这个服务了。当然了,对于Django而言,run server命令只是提供开发周期的调试使用的便捷工具,更一般的情况是通过uWSGI把这个Django服务跑起来,以获取并比run server更好的服务性能。
此时部署整一个架构图如下:
对于请求量非常少的服务,这样的部署不会有什么问题,但如果这个服务请求量上来的时候,这样部署的架构就很有问题了。
首先一个很客观的问题就是,如果单从服务器的物理特性来看,这个服务器就不能支持这么高的请求量。这种情况下,就迫使开发者去把服务迁移到一个CPU更强、内存更高,综合性能更好的服务器。通过更换服务器当然可以解决这个问题,在不考虑成本的条件下,总可以找到性能更好的服务器来替换原来的服务器以支撑服务,但这种理想的条件不在本文考虑范围之内。
第二个问题就是,如果服务Server单节点发生了故障,就必然会影响整个服务,因为对于众多的Client客户端都是连接的一个Server服务端,如果这个节点不可用了,势必会影响所有使用了客户端的用户。
为了解决这两个显而易见的问题,就必须提出一种可以横向拓展的部署架构,使得服务可以支撑的请求量可以随着服务的横向拓展而增加。因而就催生了如下的部署架构:
基于代理的可横向拓展的C/S架构
在这个部署的架构当中,除了Server节点,还多出了一个叫“Proxy”的节点,那么这个节点是干嘛的呢?
“Proxy”的这个节点,它把他接收的所有的请求都转发到他后面的Server节点当中,然后等待Server节点处理请求,再从Server节点取回执行结果返回到Client。所以“Proxy”的这个节点,他实际上不处理任何的请求。
我们先来看这样子的架构怎么解决了以上的问题,再来思考“Proxy”的这个角色。
首先是第一个问题,服务器性能不足的问题,这个架构如何解决性能不足的问题呢?在这个架构里面,假设Server节点S1性能到达瓶颈了,不能处理更多的请求了。如果采用上面的这个架构,那么我们可以添加Server节点S2,同时告诉“Proxy”节点,让他把部分原来转发到S1节点的请求转发到我这里来。这样子通过服务分流减少压力的方法就可以解决原来S1节点性能不足的问题了。
接着是第二个问题,单点服务器挂掉了怎么办。还是考虑Server节点S1和S2,两者所能够提供的服务是一样的,假设某一个时候S1挂掉了,这时如果有“Proxy”节点的存在,并且“Proxy”节点能够察觉到S1挂掉了的话,那么让“Proxy”节点把原来要转发给S1节点的请求转发到S2进行处理就可以了,这样子通过服务冗余的方法就可以解决原来S1突然挂掉影响服务的问题。
解决了这两个问题,接下来我们再从这两个问题里面“Proxy”的角色来理解,什么叫做代理。
在第一个问题里面,“Proxy”节点通过服务分流的方法来减少S1的压力,对于原来应该被S1服务的,却由于被“Proxy”节点转发而被S2服务的Client而言,Client他并不知道实际上是由S1处理的还是S2处理的,Client拿到的是一个从“Proxy”节点返回的结果,换言之,Client并不知道自己的请求实际上是被哪个处理的,他只需要往“Proxy”节点发送请求就好了,剩下的工作就由“Proxy”节点去解决。
也就是,“Proxy”节点相当于一个中介,或者说是一个代理,代理Client去寻找实际的Server节点去完成服务。这样子的模式在现实生活也非常常见,在买房子的时候,通常由房产中介帮助你完成和卖者之间的手续,而不需要你亲自去处理这些事情,你只需要协调好自己与中介之间的手续就好了,这里的中介,就和我们的“Proxy”节点所做的工作非常类似。
同样的,在第二个问题里面,也是相似的理解方式,Client并不需要感知S1是否还能正常工作,Client只需要把请求发送给“Proxy”节点,由它去帮忙处理就可以了。
因此,这里面的“Proxy”节点,也就是我们的代理节点。
正向代理与反向代理
理解了什么是“代理”,离我们理解什么是“反向代理”就只差“反向”两个字了,与“反向”相对的,就是“正向”,本质上来讲,代理都是存在于Client和Server之间,但是由于性质不同,所以也分为这两种。在这一个部分,我们将会学习,什么是反向代理,什么是正向代理。
直观的以两个例子去理解什么是正向代理和反向代理。假设由A、B和C三人,他们之间存在借钱的关系。
对于正向代理,理解起来就是:
- A需要钱,A知道C由很多钱,想向C借钱
- 但是A和C有矛盾,于是A想到通过B去借C借钱
- B向C借到钱了,C不知道是A的存在
- 这样B就帮助A借到了Z的钱
在这个过程,B就充当了代理借钱的角色,并且是代替A去借钱的,这样就是正向代理。
接着是反向代理:
- A需要钱,C有很多钱,A不知道C很多钱
- A找B借钱
- B知道C有很多钱
- B向C借钱,并把借到的钱给A,而没有使用自己的钱借给A
- A拿到钱以后,以为钱是B的,A不知道C的存在
在这个过程当中,B也充当了代理借钱的角色,不过这次不是代替A去借的,而是用C的钱借给A的,换言之即是代替C将钱借给了A,这就是反向代理。
- 在例子里面,把A换成Client,把C换成Server,就是计算机的例子了。
两者区别
- 服务对象不同
- 正向代理,代理的是客户端,也就是例子中的A,服务端不知道实际发起请求的客户端
- 反向代理,代理的是服务端,也就是例子中的C,客户端不知道实际提供服务的服务端
正向代理
反向代理
2. 安全模型不同
- 正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此必须采取安全措施以确保仅为授权的客户端提供服务
- 反向代理都对外都是透明的,访问者并不知道自己访问的是代理,访问者不知道服务节点的存在,认为处理请求的就是代理节点
总而言之,正向代理是从客户端的角度出发,服务于局域网用户,以访问非特定的服务,其中最典型的例子就是翻墙;反向代理正好与此相反,从服务端的角度出发,服务于所有用户,隐藏实际的服务节点,服务节点的架构对用户透明,以代理节点统一对外服务。
作者:咚咚呛
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作
代理,就是客户端在局域网内,往往也意味着客户端在防火墙背后。客户端需要通过代理才能连接互联网上的服务器,代理有权控制客户端能够连接上什么服务器。
反向代理,就是服务器在局域网内,然后把上面所说的一切都反过来:服务器在防火墙背后,只能通过代理才能接受来自客户端的连接,代理有权控制什么客户端能够连上服务器。
一个是代理(v)客户端,为客户端收发请求,使真实客户端对服务器不可见。
一个是代理(v)服务器,为服务器收发请求,使真实服务器对客户端不可见。
因为服务对象和自身角色不同,所以刚好是相反的。
(v代表动词)
许多公司使用代理服务器在网络之间路由和保护流量。
但是,很多同学看到「反向」这个词汇时都会觉得困惑,不知所以。
既然有「反向」代理,自然会考虑到有没有「正向」代理呢?
答案是肯定的,今天就讨论一下“反向”和“正向”代理术语的起源,并了解Nginx如何作为反向代理工作。
按照管理,我不喜欢上来就直接抛出反向代理的概念,这样很容易造成大家看的云里雾里。
首先,先从代理服务器的基础知识开始。
以日常我们熟悉的场景为例,我们打开浏览器,在地址栏输入 http://www.baidu.com,然后按下Enter键跳转到百度页面,这个看似非常简单的场景涉及到几个模块:
- 客户端
- 代理服务器
- 互联网服务商
也就是客户端发送一个请求并不是直接触达到网络服务器,而是经过中间一个代理服务器转发、桥接之后才将整个链路串到一起。
我们常说的代理服务器有时也被称为“正向”代理,它是客户端和网络中其他服务器之间的中介服务器。
当客户端发出请求时,正向代理会拦截请求,并代表客户端将其转发到适当的服务器。通过这样做,客户端的身份和位置得以隐藏,转换和掩盖IP地址,阻止未知的流量从服务器进入,然后服务器响应发送回正向代理,正向代理再将其转发回客户端。
了解了正向代理的链路,下面深入探讨“反向”代理的概念。
反向代理与传统的代理服务器着重保护客户端不同,它用于保护服务器。反向代理不用于直接为客户端请求提供服务。相反,它作为一个网关,允许那些在其后面的服务器接收客户端请求,而不直接将其暴露在互联网上。
下图展示了正向代理和反向代理之间的差异:
正向代理通常用于:
- 避免浏览器限制
- 阻止访问某些内容
- 保护客户端
反向代理适用于:
- 保护服务器
- 负载均衡
- 缓存静态内容
- 加密和解密SSL通信
除了其HTTP服务器功能外,Nginx还可以作为电子邮件(IMAP、POP3和SMTP)的代理服务器,并作为HTTP/2、TCP和UDP协议的反向代理和负载均衡器。
理解了正向和反向代理,下面就介绍一下经常用于反向代理的一款工具--Nginx。
Nginx被称为“反向”代理,因为它充当客户端和后端服务器之间的中间服务器,在后端服务器响应时拦截响应并将其转发给适当的客户端。通过这种方式,Nginx作为反向代理发挥作用。
Nginx用于反向代理的优点:
- 增强安全性:Nginx可以充当防火墙,阻止恶意流量并保护后端服务器免受攻击。
- 高可用性:Nginx可以配置为在多个后端服务器之间分配流量,确保高可用性并降低停机风险。
- 简化管理:Nginx可以用于从单个服务器提供多个域或应用程序,从而成为管理复杂Web环境的高效解决方案。
- 负载均衡:Nginx可以将入站流量分发到多个后端服务器,这可以提高性能并确保高可用性。
- 终止SSL/TLS:Nginx可以终止SSL/TLS连接,这可以从后端服务器卸载处理并提高性能。
到这里就介绍完了反向代理,如果觉得对自己有帮助,麻烦给 @Jackpop 点赞支持一下吧!
推荐阅读
我的理解:
代理:在客户这一端,替客户收发请求。
反向代理:在服务器机房这一端,替服务器收发请求,也就是说请求和响应都先经过反向代理。具有缓存、安全、负载均衡等作用。