互联网
IP 地址
网络代理
反向代理
跨境电子商务

反向代理为何叫反向代理?

与正向代理比起来,反向代理是什么东西反向了?
关注者
2,533
被浏览
1,434,270

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之禅

编辑于 2020-04-19 17:52

正向代理(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)的好处是什么呢?

  • 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)

这样加上一个反向代理(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,从而提供更快速的响应服务。

图片来源 https://avinetworks.com/glossary/global-server-load-balancing-2/

Nginx应该是最常见的反向代理服务器之一了,如果你从事Web相关的开发工作,一定对这个报错非常熟悉LOL。

Nginx 502 Bad Gateway

在网络架构的工程实践上,如果一个私有网络想要访问其他网络的资源,那么一般需要给私有网络加上一个正向代理(Proxy)。如果一个私有网络想要被其他网络访问,那么一般需要给私有网络加上一个反向代理(Reverse Proxy),或者API Gateway(本身也可以算作一种Reverse Proxy)。

PrivateNetwork - Proxy - PublicNetwork | PublicNetwork - ReverseProxy - PrivateNetwork

为啥代理Client就是"正向",而代理Server就是"反向"呢?

我的猜测是这个正反方向是指的请求的方向:Client的代理请求是向外发出的,直观理解上可能更靠近正向;Server的代理请求是向内接收的,直观上理解可能更靠近反向。当然,这个也基本上属于个人推测......实际上这个也不重要。咱们只需要知道正向代理代理的是Client,反向代理代理的是Server就够了。

编辑于 2022-12-16 22:39

很久以前,老王去饭店吃饭,需要先到饭店,七荤八素点好菜,坐等饭菜上桌,然后大快朵颐,不亦乐乎。

有了第三方订餐外卖平台(代理),老王懒得动身前往饭店,老王打个电话或用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文章更新于公众号,欢迎阅读:

编辑于 2018-08-17 17:25

精辟,正向代理隐藏真实客户端,反向代理隐藏真实服务端,一下就懂了,很有帮助

发布于 2017-02-23 10:14

阿笠硕士

的答案补图

发布于 2015-10-21 11:22

上面的答案都说的很好,我画了张图能更直观地解释为何反向代理叫“反向“代理

正向代理中,proxy和client同属一个LAN,对server透明;

反向代理中,proxy和server同属一个LAN,对client透明。

实际上proxy在两种代理中做的事都是代为收发请求和响应,不过从结构上来看正好左右互换了下,所以把后出现的那种代理方式叫成了反向代理。

欢迎指正,以上。

编辑于 2015-05-20 10:03

先说正向代理,比如要访问youtube,但是不能直接访问,只能先找个翻墙软件,通过翻墙软件才能访问youtube. 翻墙软件就叫做正向代理。

所谓的反向代理,指的是用户要访问youtube,但是youtube悄悄地把这个请求交给x-art来做,那么x-art就是反向代理了。

编辑于 2017-11-10 12:07

正向代理代理客户端,反向代理代理服务器

发布于 2015-06-17 23:44

代理其实就是一个中介,A和B本来可以直连,中间插入一个C,C就是中介。刚开始的时候,代理多数是帮助内网client访问外网server用的(比如HTTP代理),从内到外。后来出现了反向代理,"反向"这个词在这儿的意思其实是指方向相反,即代理将来自外网client的请求forward到内网server,从外到内

编辑于 2014-08-06 00:01

所谓反向代理基本上就是一个服务端的负载均衡器。很好奇java界总喜欢弄一些新名词。。莫名其妙。语言是用来交流的,不是用来装逼的。有兴趣的可以追根溯源一下这个名词的出处。我理解就是写apache文档那个人造出来的。然后一帮人不理解这个反人类的名词。然后理解了的自以为得意经常面试考,看到这个名词的人以为逼格很高然后不知怎么的这个名词就”流行“起来。我对这个名词的想法是跟UML一样,属于反人类的范畴,如果你不理解,完全可以。碰到别人说到这个名词,你不理解就问他是什么就行了。

=====================更正=======================

据我最新考据,这个词语最早的出处应该是Sun公司2004年出的这本书

Securing Web Applications through a Secure Reverse Proxy

不清楚作者新造一个名词的想法是什么。目前也查不出是哪个家伙发明这个反人类名词的。

处于同一位置的负载均衡器的feature可完全包含所谓的反向代理。

Load balancing (computing)
编辑于 2016-06-15 10:39

更新回答来一波————————————————————————

要说清楚什么是反向代理,我们就需要先从最简单的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三人,他们之间存在借钱的关系。

对于正向代理,理解起来就是:
  1. A需要钱,A知道C由很多钱,想向C借钱
  2. 但是A和C有矛盾,于是A想到通过B去借C借钱
  3. B向C借到钱了,C不知道是A的存在
  4. 这样B就帮助A借到了Z的钱

在这个过程,B就充当了代理借钱的角色,并且是代替A去借钱的,这样就是正向代理。

接着是反向代理:
  1. A需要钱,C有很多钱,A不知道C很多钱
  2. A找B借钱
  3. B知道C有很多钱
  4. B向C借钱,并把借到的钱给A,而没有使用自己的钱借给A
  5. A拿到钱以后,以为钱是B的,A不知道C的存在
    在这个过程当中,B也充当了代理借钱的角色,不过这次不是代替A去借的,而是用C的钱借给A的,换言之即是代替C将钱借给了A,这就是反向代理。
  1. 在例子里面,把A换成Client,把C换成Server,就是计算机的例子了。

两者区别

  1. 服务对象不同
  • 正向代理,代理的是客户端,也就是例子中的A,服务端不知道实际发起请求的客户端
  • 反向代理,代理的是服务端,也就是例子中的C,客户端不知道实际提供服务的服务端

正向代理

反向代理

2. 安全模型不同

    • 正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此必须采取安全措施以确保仅为授权的客户端提供服务
    • 反向代理都对外都是透明的,访问者并不知道自己访问的是代理,访问者不知道服务节点的存在,认为处理请求的就是代理节点

总而言之,正向代理是从客户端的角度出发,服务于局域网用户,以访问非特定的服务,其中最典型的例子就是翻墙;反向代理正好与此相反,从服务端的角度出发,服务于所有用户,隐藏实际的服务节点,服务节点的架构对用户透明,以代理节点统一对外服务。


作者:咚咚呛

来源:慕课网

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

编辑于 2019-04-18 11:57

代理,就是客户端在局域网内,往往也意味着客户端在防火墙背后。客户端需要通过代理才能连接互联网上的服务器,代理有权控制客户端能够连接上什么服务器。

反向代理,就是服务器在局域网内,然后把上面所说的一切都反过来:服务器在防火墙背后,只能通过代理才能接受来自客户端的连接,代理有权控制什么客户端能够连上服务器。

发布于 2023-01-25 14:45

一个是代理(v)客户端,为客户端收发请求,使真实客户端对服务器不可见。

一个是代理(v)服务器,为服务器收发请求,使真实服务器对客户端不可见。

因为服务对象和自身角色不同,所以刚好是相反的。

(v代表动词)

编辑于 2015-04-15 22:52

许多公司使用代理服务器在网络之间路由和保护流量。

但是,很多同学看到「反向」这个词汇时都会觉得困惑,不知所以。

既然有「反向」代理,自然会考虑到有没有「正向」代理呢?

答案是肯定的,今天就讨论一下“反向”和“正向”代理术语的起源,并了解Nginx如何作为反向代理工作。

按照管理,我不喜欢上来就直接抛出反向代理的概念,这样很容易造成大家看的云里雾里。

首先,先从代理服务器的基础知识开始。

以日常我们熟悉的场景为例,我们打开浏览器,在地址栏输入 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 点赞支持一下吧!


推荐阅读

发布于 2023-04-19 21:31

我的理解:

代理:在客户这一端,替客户收发请求。

反向代理:在服务器机房这一端,替服务器收发请求,也就是说请求和响应都先经过反向代理。具有缓存、安全、负载均衡等作用。

编辑于 2014-08-06 15:31