架构深渊

慢慢走进程序的深渊……关注领域驱动设计、测试驱动开发、设计模式、企业应用架构模式……积累技术细节,以设计架构为宗。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

反向代理-- WEB服务的加速器[转]

Posted on 2009-05-17 16:48  chen eric  阅读(1157)  评论(0编辑  收藏  举报

 

昨天j.L问我http cache怎么设置,当时脑子有点糊涂,一时没想到其实他问的就是反向代理如何设置。

首发:PHP CUP xiaobao

什么是反向代理?
反向代理就是代理服务器(如ISA、Squid)的一种特殊功能,这个功能可以加快客户访问您WEB服务器的速度。是否有正向代理?是的,正向代理它也可加快用户访问WEB服务器的速度。两者有何区别?这样理解,使用代理服务器的正向代理功能,代理的是您内网用户访问因特网上的任何WEB服务器,而使用代理服务器的反向代理功能,则是代理来自因特网上的任何客户访问您内网的WEB服务器。

快马加鞭的原理是什么?
可能您的身边围满了跑保险、银行卡、化妆品推销的人,这些人就是企业的代理人,您无需跑到银行就可以办理银行卡,因为银行代理人缓存了银行需要您填写的一些单据,其实这就是正向代理的过程。反过来,其实您也在卖自己的手编毛衣,那么上述那些人同样可以作为您的代理人,当有公众需要时,无须直接和您联系,因为代理事先缓存了您要卖的毛衣,这个业务对于代理人来说就是反向代理过程。那么反向代理是如何加速您卖毛衣服务的呢?



图中,三个反向代理服务器就是刚才提到的跑保险、银行卡、化妆品推销人,防火墙内部的服务器就是您。您事先把编织好的毛衣分发给这3个人,这样,他们就分担了您一个人繁忙的卖毛衣服务。反映到现实,我们可以使用多个代理服务器来处理对一个高用量内容服务器的请求,这样做的好处是内容服务器可以处理更高的负载,并且比其独自工作时更有效率。在初始启动期间,代理服务器首次从内容服务器检索文档,此后,大部分来自客户的请求直接在缓存服务器被返回了,从而减轻了对内容服务器的请求数。

特别注意:新请求和CGI请求必须一路直达内容服务器,其余的请求可以由代理服务器直接进行处理。显而易见,一个新请求必须先到达内容服务器,否则缓存哪来的内容呢?一个CGI请求就是对动态变化页面的请求,比如您正在看的这篇文章页就随时可能因用会的回帖而改变,反向代理一般不缓存这种请求的内容页。

如何配置反向代理?
一般提供缓存功能的代理服务器软件都可以配置反向代理功能,比如微软的ISA,或者Linux下的Squid,本文仅以Squid为例,两者原理一样。

使用squid配置反向代理,主要就是squid.conf配置文件。如果使用系统自带的Squid软件包,配置文件在
/etc/squid/目录下。

1、单台Squid反向代理服务器<==>单个WEB服务器

vi 
/etc/squid/squid.conf

http_port 
80
httpd_accel_host 
172.10.1.1
httpd_accel_port 
80
httpd_accel_single_host on
httpd_accel_with_proxy on

指令作用:

http_port,指定Squid监听HTTP请求的端口,一般设置为80端口,这样使用户感觉不到反向代理的存在,就像访问真正的WEB服务器一样。比如用户不需要在浏览器里敲入http:
//www.phpcup.cn:8080,像以前一样直接输入http://www.phpcup.cn便可以了。

httpd_accel_host,指定WEB服务器的监听端口。

httpd_accel_host,指定WEB服务器的IP地址。

httpd_accel_single_host,指令httpd_accel_single_host为on时,Squid被设置为仅对单一的web服务器作反向代理。就是说,一个反向代理服务器不仅可以为单台WEB原内容服务器提供服务,也可同时为多台服务。当Squid为多台WEB服务器提供反向代理时,此命令设置为off。

httpd_accel_with_proxy,若希望Squid既作反向代理服务器又作本地机器的上网的正向代理服务器,则需将此命令设置为on。

2、多台Squid反向代理服务器<==>单个WEB服务器
Squid反向代理的配置如(
1)所述一样,现在您需要做的是把目光转向DNS服务器的配置。我们知道,用户在浏览器中输入的是主机名,而非IP地址,但计算机网络设备必须知道IP地址才可以通信,这就需要一台DNS服务器实现主机名到IP地址的转换,更详细的工作原理可访问PHP CUP。

现在我们要做的是在DNS服务器上实现对多台Squid反向代理服务器的轮询。所谓轮询,就是当第一个用户请求phpcup.cn的IP地址时,返回的是123.
123.123.1,下一个则返回123.123.123.2,再下一个来自用户的请求返回的是123.123.123.3,这样,3台Squid服务器的公网IP被DNS服务器轮番展示给用户。无论使用何种DNS服务器软件来配,其数据库都是这样的:
www.phpcup.cn.    IN  A  
123.123.123.1
www.phpcup.cn.    IN  A  
123.123.123.2
www.phpcup.cn.    IN  A  
123.123.123.3
可见,一个主机名的A资源记录对应了多台Squid反向代理服务器的地址,实现了轮询效果。

特别注意:对于DNS服务器,您可以通过设置轮询的方式,来解决压力不均问题。以BIND 
9.X为例,修改其配置文件named.conf

options {
    rrset
-order { order cyclic; };
};

rrset
-order命令有三个可选参数:random、fixed、cyclic 
random,随机返回A记录的IP地址
fix,将多个A记录按配置文件的顺序固定给出
cyclic,循环返回A记录的IP地址

我们需要的正是cyclic,round
-robin(轮询)方式, 以1->2->3->1->2…这样的方式应答用户的请求。

重新启动BIND服务 
/etc/init.d/named reload

使用dig www.phpcup.cn 跟踪DNS服务器的轮询配置是否生效。