引 言:Nginx作为时下最流行的HTTP服务器之一,同时它是一个反向代理服务器,提到反向代理服务器,有同学可能觉得这个概念很模糊,如果说到代理,他可能明白,但是再引出一个正向代理,估计懵了…
代理服务技术是一门很古老的技术,是在互联网早期出现就使用的技术。一般实现代理技术的方式就是在服务器上安装代理服务软件,让其成为一个代理服务器,从而实现代理技术。常用的代理技术分为正向代理、反向代理和透明代理。
一般情况下,如果没有特别说明,代理技术默认说的是正向代理技术。它隐藏了真实的请求客户端,服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求,知名的科学上网工具s 扮演的就是典型的正向代理角色。
他的工作原理就像一个跳板。举个例子,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我。
现实中的例子就是“”。不过自从VPN技术被广泛应用外,“”不但使用了传统的正向代理技术,有的还使用了VPN技术。
早期的正向代理中,很多人使用正向代理就是提速。
Cache(缓存)技术和代理服务技术是紧密联系的。
传统代理服务器的特点是用户隐藏在代理服务器之后,那么,反向代理服务器的特点便与此刚好相反,那就是Web服务器隐藏在代理服务器之后。我们将这种代理机制称为反向代理,同时,实现这种机制的服务器,便称为反向代理服务器。
在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的接入请求蜂拥而入时,会造成服务器忙不过来的局面,可以使用多个服务器来共同分担成千上万的用户请求,这些服务器提供相同的服务,对于用户来说,根本感觉不到任何差别。
反向代理隐藏了真实的服务端,当我们请求 www.baidu.com 的时候,就像拨打10086一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。
Nginx就是性能非常好的反向代理服务器,用来做负载均衡。(开放的反向代理应用:Nginx和NAT123。Nginx是单纯的反向代理,需要自行搭建反向代理服务才能使用,效率高。NAT123是结合了NAT和反向代理的应用,可以直接使用,解决80端口问题等,速度快。)
用户和负载均衡设备直接通信,也意味着用户做服务器域名解析时,解析得到的IP其实是负载均衡的IP,而不是服务器的IP,这样有一个好处是,当新加入/移走服务器时,仅仅需要修改负载均衡的服务器列表,而不会影响现有的服务。
Cache(缓存)技术和代理服务技术是紧密联系的。
服务器自身硬件的垂直扩展不在我们的讨论之中,这里我谈及的扩展主要是水平扩展,我们经常用可扩展性来反映这种扩展能力,所谓可扩展性,实际上是指系统通过扩展规模来提升承载能力的本领,这种本领往往体现在增加物理服务器或者集群节点等方面,可以说,这种本领越强,承载能力可提升的空间就越大。但是,这种本领总是受到或多或少的制约。
对于Web站点的水平扩展,负载均衡是一种常见的手段。
负载均衡方法中,基于HTTP重定向的方式非常简单,基本上完全由Web应用程序即可实现(因为HTTP重定向具备了请求转移和自动跳转的本领,所以除了满足应用程序需要的各种自动跳转之外,它还可以用于实现负载均衡,以达到Web扩展的目的)。
接下来,我们编写了首页 index.php 的代码,如下所示:
$domains = array(
'www1.baidu.com',
'www2.baidu.com',
'www3.baidu.com'
);
$index = substr(microtime(), 5, 3) % count($domains);
$domain = $domains[$indnx];
header("Locatin: http://$domain");
当用户每次访问站点入口,也就是 index.php 的时候,程序会随机挑选三台服务器中的一台,然后返回重定向指令。从整体上看,首页请求转移到三台服务器的次数基本上是相等的,所以我们已经做到了一定程度的均衡。但是这里为什么没有采用依次轮询的重定向策略呢?它是一种基本的调度算法,在这个例子中如果采用RR方式的话,站点首页程序必须将所有请求按照顺序依次转移给三台服务器,实现绝对意义上的均衡,但是,与此同时,性能上的代价也是不可避免的。
DNS负载均衡。DNS服务器可以充当负载均衡调度器(也称均衡器),它就像前面提到的重定向转移策略一样,将用户的请求分散到多台服务器上,但是它的实现机制完全不同。相比之下,为DNS服务器开发自定义的调度策略就不那么容易了,但幸运的是,类似bind这样的DNS服务器软件提供了丰富的调度策略供你选择,其中最常用的就是根据用户IP来进行智能解析,这意味着DNS服务器可以在所有可用的A记录中寻找离用户最近的一台服务器。
反向代理负载均衡。反向代理服务器的核心工作便是转发HTTP请求,因此它工作在HTTP层面,也就是TCP七层结构中的应用层(第七层),所以基于反向代理的负载均衡也称为七层负载均衡,实现它并不困难,目前几乎所有主流的Web服务器都热衷于支持反向代理的负载均衡。
如果把正向代理、反向代理和透明代理按照人类血缘关系来划分的话。那么正向代理和透明代理是很明显堂亲关系,而正向代理和反向代理就是表亲关系了 。透明代理的意思是客户端根本不需要知道有代理服务器的存在。
正向代理是客户端配置,反向代理是服务器端配置。
正向代理可以访问 Google,反向代理只能访问特定网址。
正向代理中,proxy和client同属一个LAN,对server透明;
反向代理中,proxy和server同属一个LAN,对client透明。
正向代理,代理相当于一个透明的中间件 a,你访问任何网站 ABCDE 都走这个中间件 a,但在你看来,你访问的永远都是 ABCDE,而不是 a。
反向代理,固定 a 为 A 的反向代理,唯一,访问 a 相当于访问 A,访问不到 BCDE,同时在你看来,你访问的不是 A 而是 a,你甚至不知道 A 的存在。
正向代理– 我代理帮我干活。(你发出去的 http 请求是完整的 url,由代理生成 http 请求头)
反向代理– 我不知道帮我干活的是代理。(服务器自己的负载均衡服务器调度,你不用管)
透明代理– 我不知道他帮我干了活(著名的劫持, 重组 http 请求)