代理服务器和反向代理服务器有什么区别?

1929

代理服务器和反向代理服务器有什么区别?


59
Apache文档中也有很好的解释。 - Paolo
3
@Paolo让这篇文章比维基百科上的文章易懂多了。也许我应该考虑最终编辑一些类似的信息到维基百科上去…… - RastaJedi
假设我有需要连接到主机C的主机A,但不能直接连接。相反,它被配置为具有主机条目或可能是DNS,调用B将请求转发到C。C不关心或知道B。这是正向代理还是反向代理? 这是正向代理。 - Daniel Leach
如果主机A无法直接访问主机C,必须先配置为联系主机B,那么主机B就是一个传统的转发或“出站”代理服务器。 - TaylorMonacelli
9
正向代理让客户端匿名(如 Tor),反向代理则让后端服务器匿名(如在 DMZ 后面的服务器)。 - 8bitjunkie
21个回答

3169
前面的答案都是正确的,但可能有点过于简洁了。 我会尝试添加一些例子。
首先,“代理”这个词描述的是一个人或某个事物代表他人行事。
在计算机领域,我们讨论的是一个服务器代表另一台计算机行动。
出于可访问性的目的,我将限制我的讨论范围在web代理上 - 但是,代理的概念不仅限于网站。
正向代理
大多数关于web代理的讨论都涉及到“正向代理”这种类型的代理。
在这种情况下,“正向代理”的事件是代表原始请求者从另一个网站检索数据。
三台计算机的故事(第一部分)
举个例子,我将列出三台连接到互联网的计算机。
X = 您的计算机,或互联网上的“客户端”计算机 Y = 代理网站,proxy.example.org Z = 您想要访问的网站,www.example.net
通常,一个人会直接从X - > Z 连接。
然而,在某些情况下,最好为X代表询问Y - > Z, 其链如下:X - > Y - > Z。
X希望使用正向代理服务器的原因:
以下是(非常)部分用途列表:
  • 1) 由于以下原因,X无法直接访问Z:

    • a) 管理X互联网连接的某人决定阻止对站点Z的所有访问。

      • 示例:

        • “风暴蠕虫”通过诱骗人们访问familypostcards2008.com来传播,因此系统管理员已经阻止了对该站点的访问,以防用户意外感染。

        • 一家大公司的员工在facebook.com上浪费了太多时间,因此管理层希望在工作时间内阻止访问。

        • 当地的小学禁止访问playboy.com网站。

        • 政府无法控制新闻的发布,因此通过阻止像wikipedia.org这样的网站来控制对新闻的访问。请参见TORFreeNet

    • b) Z的管理员已经阻止了X。

      • 示例:

        • Z的管理员注意到来自X的黑客攻击,因此决定阻止X的IP地址(和/或网络范围)。

        • Z是一个论坛网站。X正在论坛上发送垃圾信息。Z阻止了X。

反向代理

三台计算机的故事(第二部分)

在这个例子中,我将列出连接到互联网上的三台计算机。

  • X = 您的计算机,或互联网上的"客户端"计算机
  • Y = 反向代理网站,proxy.example.com
  • Z = 您想要访问的网站,www.example.net

通常,人们会直接从 X --> Z 连接。

然而,在某些情况下,更好的选择是由 Z 的管理员限制或禁止直接访问,并强制访问者首先通过 Y。 因此,与之前一样,数据是由 Y --> Z 代表 X 检索的,其链如下: X --> Y --> Z

与“正向代理”相比,这次不同的是,用户 X 不知道他正在访问 Z,因为用户 X 只看到他正在与 Y 通信。 服务器 Z 对客户端是不可见的,只有反向代理 Y 在外部可见。反向代理不需要客户端方面的(代理)配置。

客户端 X 认为他只是与 Y 通信 (X --> Y),但现实是 Y 再次转发所有通信 (X --> Y --> Z)。

Z建立反向代理服务器的原因:

  • 1)Z希望所有流量都通过Y访问其网站。
    • a)Z拥有一个大型网站,数百万人想查看该网站,但单个Web服务器无法处理所有流量。因此,Z设置了许多服务器,并在互联网上放置了反向代理,当用户尝试访问Z时,它将把用户发送到最接近他们的服务器。这是内容分发网络(CDN)概念的一部分。
  • 2)Z的管理员担心由于服务器上托管的内容而遭受报复,并且不想直接向公众暴露主服务器。
    • a)垃圾邮件品牌的所有者(例如“加拿大药房”)似乎拥有数千台服务器,而实际上大多数网站托管在更少的服务器上。此外,关于垃圾邮件的投诉仅会关闭公共服务器,而不会影响主服务器。

在上述情况下,Z有能力选择Y

帖子中的主题链接:

内容分发网络

正向代理软件(服务器端)

反向代理软件(服务器端)

TCP反向代理软件(服务器端)

另请参阅:


2
从概念上讲,我们可以将“反向代理”称为“强制”代理吗? - Thomas
7
“that will send users to the server closest to them” - 这是什么意思?所有流量都会通过代理服务器传输,对吗?因此,在其后面的“本地”服务器的位置并不重要。或者我有什么误解吗? 这句话的意思是将用户定位到距离他们最近的服务器,从而提高网络速度和响应时间。所有的流量确实会通过代理服务器转发,但代理服务器会根据用户的位置信息将请求发送到最近的服务器,以便最大限度地减少延迟和网络拥塞。 - Pavel
3
@Pavel 可能“最接近他们的服务器”不是最好的描述。更像是“将负载分配到服务器池”的更好描述。这个例子是在描述反向代理负载均衡器。 - JDS
57
这是对我来说关键所在:正向方程式为(X --> Y) --> Z,反向方程式为 X --> (Y --> Z) - Druckles
4
这样概念就清楚了。但问题仍然是为什么叫“reverse”?在反向代理的情况下我看不到任何相反的效应。我猜可能的一个原因是,在“正向代理”的情况下,需要代理的要求来自X方面,而在“反向代理”的情况下,需要代理的要求来自服务器Z方面。这有道理吗? - Animesh Kumar
显示剩余24条评论

584

一对简单的定义如下:

正向代理:代表请求者(或服务消费者)进行操作。

反向代理:代表服务/内容生产者进行操作。


484

我发现下面这张图非常有帮助。它展示了从客户端到服务器通过互联网的正向 vs. 反向代理设置的架构。这张图片将帮助你更好地理解qyb2zm302的答案和其他答案。

Forward Proxy vs Reverse Proxy

您还可以观看Peter Silva在F5的DevCentral发布的此视频

图片来源:Quora。但是,根据Martijn Pieters的说法,这张图片可能来自Pulse Secure社区或Julien Pauli的网站(法语)在developpez.com上。

它让我想起了一个经典的谚语:

一图胜千言。


19
这是你需要关注的全部内容。在浏览器中设置代理,使Netflix不知道你所在的国家,这是正向代理;将传入请求(也许你想将一个请求发送到两个服务器)定向到上游服务的是反向代理。 - Kyle Chadha
10
正向代理可以存在于互联网上。 - mac
13
上一个回答中最好的图片。谢谢 :) 反向代理也被称为“负载均衡器”,作用于服务器端(将负载分配到不同的服务器上),而正向代理则支持客户端。 - codepleb
2
Quora的作者并不是这张图片的原始作者,因为这个页面在2013年就已经存在了,而且只有一次修订。 - Martijn Pieters
2
可能是这篇来自2009年的法语教程是来源;2009年网络档案馆的副本存在JavaScript问题(持续重定向),并且图像仅在2017年被归档,但源引用与后来的来源相同的图像URL。 - Martijn Pieters
显示剩余6条评论

260

正向代理和反向代理 (2012)清楚地解释了正向代理和反向代理之间的区别。

qyb2zm302的回答详细说明了代理的应用,但在正向和反向代理之间的基本概念上犯了错误。对于反向代理,X → Y → Z,X只知道Y而不知道Z,而不是反过来。

代理只是通信(请求+响应)的中间人。客户端 <-> 代理 <-> 服务器

  • 客户端代理:客户端 <-> 代理 <-> 服务器

代理代表客户端行动。客户端知道链中涉及的所有三台机器。服务器不知道。

  • 服务器代理:客户端 <-> 代理 <-> 服务器

代理代表服务器行动。客户端只知道代理。服务器知道整个链。

对我来说,正向和反向只是客户端和服务器代理的令人困惑和透视依赖性名称。我建议放弃前者,采用后者进行明确的通信。

当然,要进一步复杂化问题,不是每台机器都是专门的客户端或服务器。如果上下文存在歧义,最好明确指定代理所在的位置以及它隧道传输的通信。


6
这个回答符合http://httpd.apache.org/docs/2.0/mod/mod_proxy.html#forwardreverse的规定,并能清晰地解释它。 - Greg Woods
10
在这个比较中,似乎最相关的特征是谁知道谁。正向代理:客户端知道代理(实际上已经配置了代理),以及目标服务器(因为它向服务器 URL 发出请求);而在反向代理的情况下,客户端将代理视为目标服务器(它不知道代理实际调用的是什么,可能是一个或多个服务器)。使用正向代理时,服务器不知道客户端的真实身份,因为代理将请求“转发”给它。正向代理:隐藏客户端;反向代理:隐藏服务器。 - Belun
@Protongun:“代理只是通信(请求+响应)的中间人。”那么首先需要代理的原因是什么?请澄清。在我看来,这个答案应该被接受。 - vikramvi
这篇帖子中的第一个链接清晰易懂,适合所有人理解。 - Legends
@Belun 用最简单的词语/术语解释得非常清楚。 - Ilangeeran
为什么会有服务器端客户端/前向代理软件?它只是“反向代理,不发送客户端信息”吗?那么,“隐藏”客户端和服务器的软件叫什么? - Minh Nghĩa

131

一些图表可能会有所帮助:

正向代理

正向代理

反向代理

反向代理


12
是吗?它们看起来一样!重写响应有什么特别之处,使代理成为“反向”代理? - 8bitjunkie
3
这段话讲的是代理服务器的不同类型和实现方式。正向代理会让客户端知道它正在与代理服务器通信,而反向代理则让客户端认为自己直接在与home.com通信。两种代理服务器也有不同的实现方式。反向代理可以很简单,它只需要改变地址并将请求转发即可。客户端需要更多的网络逻辑,但代理服务器则需要更少。相反,正向代理需要某种方式知道代理.com()的请求需要调用service.com。这样可以减少客户端上的网络逻辑,但需要代理服务器处理更多的网络逻辑。 - Kevin
2
什么是“将myhome.myhosting.com翻译为hom.com”的意思?我不明白“翻译”这个词。是像重新编写响应头的一部分之类的吗? - 1252748
这是你自己的图表吗?还是有源头的? - Peter Mortensen
1
@PeterMortensen 这些是我自己的。 - Maria Ines Parnisari
显示剩余2条评论

75

主要区别在于部署方式。Web正向代理和反向代理都具有相同的基本功能。它们接受不同格式的HTTP请求并提供响应,通常通过访问原始或联系服务器实现。

完整功能的服务器通常具有访问控制、缓存和一些链接映射功能。

正向代理是通过配置客户端机器访问的代理。客户端需要支持代理功能的协议(重定向、代理身份验证等)。代理对用户体验透明,但对应用程序不透明。

反向代理是作为Web服务器部署的代理,行为类似于Web服务器,除了它不像Web服务器那样从程序和磁盘本地组合内容,而是将请求转发给原始服务器。从客户端的角度来看,它是一个Web服务器,因此用户体验是完全透明的。

事实上,单个代理实例可以同时作为正向代理和反向代理运行,为不同的客户端群体提供服务。


只是为了确认,正向代理是客户端的,反向代理是服务器端的吗? - Yves
4
代理也是一种服务器,只是客户端需要本地配置才能进行通信。而反向代理需要在服务器本身进行配置。它们的物理节点都位于“服务器端”。 - Adib Aroui
仅供参考,不是所有代理都可以作为正向和反向代理,例如 SOCKS 可以,但 HTTP 代理不能。 - RastaJedi

71

代理(Proxy):它代表客户端发送请求。 因此,服务器将响应返回给代理,代理将响应转发给客户端。实际上,服务器永远不会“了解”客户端是谁(客户端的 IP 地址);服务器只知道代理。然而,客户端肯定知道服务器,因为它基本上格式化了要发送到服务器的 HTTP 请求,但是只是将其交给了代理。

Enter image description here

反向代理(Reverse Proxy):它代表服务器接收请求。 它将请求转发到服务器,接收响应,然后将响应返回给客户端。在这种情况下,客户端永远不会“了解”实际服务器是谁(服务器的 IP 地址)(有一些例外除外);客户端只知道代理。服务器将或不会知道实际客户端,具体取决于反向代理的配置。

Enter image description here


6
我感觉我可以把你的定义倒过来复制粘贴,它们仍然是正确的。我不认为这解释了任何关键的区别或澄清了反向代理有什么“反向”的特点? - 8bitjunkie
7
代理服务器总是代表某个人行事(向对方隐藏其身份)。“反向”指的是翻转“隐藏”的一方,第一种情况下是客户端(常规代理),第二种情况下是服务器(反向代理)。实际上,这两个术语可以互换使用,只是惯例选择了第一种情况作为常规代理(可能出于历史原因)。希望这样说清楚了。 - Dimos

53
正向代理是代表客户端(或请求主机)进行代理,而反向代理则代表服务器进行代理。
实际上,正向代理隐藏客户端的身份,而反向代理隐藏服务器的身份。最好的解释在这里,并配有图示。

40
一个代理服务器可以代理(并可选地缓存)对互联网上各种不一定相关的公共资源的出站网络请求。一个反向代理捕获(并可选地缓存)来自互联网的传入请求,并将它们分配到各种内部私有资源中,通常是为了实现高可用性。

33

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接