忙活了两天,ȝ把Squid的反向代理服务器讄好了Qȝ一下,方便后来?
本文主要讨论的是squid反向代理模式用做web加速服务器的设|?br /> 按照本文的说明,你最l可以实C个squid对多个网站进行缓存加速的功能(q些|站可以在squid本机上www.skyhe.comQ也可以在其它服务器上bbs/photo.skyhe.com)
首先
其次
www.skyhe.com 192.168.10.252
bbs.skyhe.com 192.168.10.56
photo.skyhe.com 192.168.10.119
同时Q你需要在本地的host文g加入内部的DNS解析Q比如:
192.168.10.252 www.skyhe.com
192.168.10.252 bbs.skyhe.com
192.168.10.252 photo.skyhe.com
然后
# visible name
visible_hostname cache.example.com# cache config: space use 1G and memory use 256M
cache_dir ufs /usr/local/squid/cache 1024 16 256
cache_mem 256 MB
cache_effective_user squid
cache_effective_group squid# 以上L名和~存讄比较单,略过
# 关键 1
http_port 80 # squid监听的端口,必须?0
# ------(你不想用Lwww.skyhe.com:8001讉K你的|站吧?Q?# 关键 2
httpd_accel_host virtual #加速器的主机名U或者IP地址?br /> # *如果是对多个域名加速,请填?virtual"(虚拟L模式)
httpd_accel_port 8000 #加速器的工作端口,和web服务器一?br /> httpd_accel_single_host off
httpd_accel_uses_host_header on
httpd_accel_with_proxy off #是否同时q行代理服务# 关键 3 - TAG: acl节点的设|?br /> # 讑֮可以讉K的域名别?br /> acl HostA dstdomain www.skyhe.com
acl HostB dstdomain bbs.skyhe.com
acl HostC dstdomain photo.skyhe.com
# 加速器采用http协议?000端口监听
acl acceleratedProtocol protocol HTTP
acl acceleratedPort port 8000# 关键 4 - 允许指定的域名在指定端口的访?br /> http_access allow acceleratedProtocol acceleratedPort HostA
http_access allow acceleratedProtocol acceleratedPort HostB
http_access allow acceleratedProtocol acceleratedPort HostC
# 日志讑֮
emulate_httpd_log on
cache_store_log none# 理员相兌?br /> acl manager proto cache_object
http_access allow manager all
cachemgr_passwd pass all# 最后不要忘?br /> http_access deny all
补充
一Q反向代理的概念
什么是反向代理呢?其实Q反向代理也是通常所说的WEB服务器加速,它是一U通过在繁忙的WEB服务器和Internet之间增加一个高速的WEB~冲服务器(卻IWEB反向代理服务器)来降低实际的WEB服务器的负蝲。典型的l构如下图所C:
Web服务器加速(反向代理Q是针对Web服务器提供加速功能的。它作ؓ代理CacheQ但q不针对览器用P而针对一台或多台特定Web服务器(q也是反向代理名U的由来Q。实施反向代理(如上图所C)Q只要将Reverse Proxy Cache讑֤攄在一台或多台Web服务器前端即可。当互联|用戯问某个WEB服务器时Q通过DNS服务器解析后的IP地址是Reverse Proxy Server的IP地址,而非原始Web服务器的IP地址,q时Reverse Proxy Server讑֤充当Web服务器,览器可以与它连接,无需再直接与Web服务器相q。因此,大量Web服务工作量被卸蝲到反向代理服务上。不但能够防止外部网L直接和web服务器直接通信带来的安全隐患,而且能够很大E度上减轻web服务器的负担Q提高访问速度?/p>
二. 反向代理和其它代理的比较
下面对几种典型的代理服务作一个简单的比较。在|络上常见的代理服务器有三种Q?/p>
1Q 标准的代理缓冲服务器
一个标准的代理~冲服务被用于缓存静态的|页Q例如:html文g和图片文件等Q到本地|络上的一CZQ即代理服务器)。当被缓存的面被第二次讉K的时候,览器将直接从本C理服务器那里获取h数据而不再向原web站点h数据。这样就节省了宝늚|络带宽Q而且提高了访问速度。但是,要想实现q种方式Q必d每一个内部主机的览器上明确指明代理服务器的IP地址和端口号。客L上网Ӟ每次都把h送给代理服务器处理,代理服务器根据请求确定是否连接到q程web服务器获取数据。如果在本地~冲区有目标文gQ则直接文件传l用户即可。如果没有的话则先取回文Ӟ先在本地保存一份缓Ԍ然后文件发l客L览器?/p>
2Q 透明代理~冲服务?/p>
透明代理~冲服务和标准代理服务器的功能完全相同。但是,代理操作对客L的浏览器是透明的(即不需指明代理服务器的IP和端口)。透明代理服务器阻断网l通信Qƈ且过滤出讉K外部的HTTPQ?0端口Q流量。如果客L的请求在本地有缓冲则缓冲的数据直接发给用户Q如果在本地没有~冲则向q程web服务器发求,其余操作和标准的代理服务器完全相同。对于Linux操作pȝ来说Q透明代理使用Iptables或者Ipchains实现。因Z需要对览器作M讄Q所以,透明代理对于ISPQInternet服务器提供商Q特别有用?/p>
3Q 反向代理~冲服务?/p>
反向代理是和前两U代理完全不同的一U代理服务。用它可以降低原始WEB服务器的负蝲。反向代理服务器承担了对原始WEB服务器的静态页面的hQ防止原始服务器q蝲。它位于本地WEB服务器和Internet之间Q处理所有对WEB服务器的hQ组l了WEB服务器和Internet的直接通信。如果互联网用户h的页面在代理服务器上有缓冲的话,代理服务器直接将~冲内容发送给用户。如果没有缓冲则先向WEB服务器发求,取回数据Q本地缓存后再发送给用户。这U方式通过降低了向WEB服务器的hC而降低了WEB服务器的负蝲?/p>
三.反向代理工作原理
反向代理服务器位于本地WEB服务器和Internet之间,如下图所C:
当用h览器发出一个HTTPhӞ通过域名解析请求定向到反向代理服务器(如果要实现多个WEB服务器的反向代理Q需要将多个WEB服务器的域名都指向反向代理服务器Q。由反向代理服务器处理器h。反向代理一般只~存可缓冲的数据Q比如html|页和图片等Q,而一些CGI脚本E序或者ASP之类的程序不~存。它Ҏ从WEB服务器返回的HTTP头标记来~冲静态页面。有四个最重要HTTP头标讎ͼ
Last-Modified: 告诉反向代理面什么时间被修改
Expires: 告诉反向代理面什么时间应该从~冲Z删除
Cache-Control: 告诉反向代理面是否应该被缓?/p>
Pragma: 告诉反向代理面是否应该被缓?
例如Q在默认情况下,ASP面q回” Cache-control: private.” Q所以ASP面时不会在反向代理服务器缓存的
四.代理服务器Y件squid?/p>
Squid Internet Object Cache (Harvest Project的后l版? 是美国政府大力助的一研I计划,其目的ؓ解决|络带宽不的问题,是现在Unixpȝ上用者最多功能也最完整的一套Y体。Apache和Netscape虽附有相关的Proxy模块Q但因其功能单而不够普及。有关squid的详l说明可到squid|站(http://www.squid-cache.org)查询?/p>
httpd_accel_with_proxy on
如果希望squid既作反向代理服务器又作本地机器的上网代理Q需要将httpd_accel_with_proxy 改ؓ onQ默认情况下是off
httpd_accel_uses_host_header off
在HTTP协议1.1中,HTTPh包括一个主机头信息Q指定URL的主机名或者主机的IP地址。这个选项可以用来完成多个后台WEB服务器的反向代理功能?/p>
2QSquid反向代理多个后台WEB服务?/p>
我们可以用Squid反向代理多个后台WEB服务器。例如:我们可以配置squid同时反向代理www.abc.com, www.xyz.com, www.lmn.com三个后台WEB服务器,C意囑֦下:
Squid的配|如下:
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_single_host off
httpd_accel_uses_host_header on
Q注?~译Squid旉ȀzInternal DNS选项Q?/code>
然后讄讄反响代理需要的域名解析QInternet用户通过q里解析三个|站的域名)如下Q?/p>
www.abc.com 202.102.240.74
www.xyz.com 202.102.240.74
www.lmn.com 202.102.240.74
使三个域名都指向反向代理服务器的IP地址202.102.240.74?/p>
下面讄反向代理所需要的DNS入口信息Q即讄内部DNSQ仅仅是squid在内部用,Internet用户不可见)。有两种Ҏ可以讄内部DNSQ用内部DNS服务器来解析或者?etc/hosts文g来实现?/p>
使用内部DNS服务器的资源记录如下Q?/p>
www.abc.com IN A 172.16.1.2
www.xyz.com IN A 172.16.1.3
www.lmn.com IN A 172.16.1.4
如果使用/etc/hosts文g来实现内部DNSQ编译时应用disable internal dns选项Q?~辑/etc/hosts文gd如下条目Q?/p>
172.16.1.2 www.abc.com
172.16.1.3 www.xyz.com
172.16.1.4 www.lmn.com
l论
通过本文中的和相兛_例,可以看出Q反向代理方式不单是一UWEB服务器加速器Q而且使也一U对外提供Web发布时用的有效的防火墙技术,使用它不但能节约紧缺的IP地址资源Q加速WEB服务器的讉K速度Q而且能够保护WEBLQ因此能够适应多种应用场合?/p>
Squid最典型的应用是代理局域网的机器联入互联网Q它支持现在行的网l协议。Squid的另一w常出色的功能是实现反向代理功能?/p>
五.使用Squid配置反向代理QHTTP 加速器Q?/p>
通过squid配置反向代理主要是配置“squid.conf”q个配置文g。下面以Linux操作pȝZq行介绍Q其它版本的在UNIX也同样适用。在Linux中squid如果是以源代码方式安装的话,q个文g一般在“/usr/local/squid/etc/”目录下。如果是pȝ自带的squidQ一般配|文件在“/etc/squid/”目录下?/p>
1Q Squid反向代理单个后台WEB服务?/p>
如果WEB服务器和反向代理服务器是两台单独的机器(一般的反向代理应该有两块网卡分别连接了内外部网l)。那么,应该修改下面的内Ҏ讄反向代理服务?/p>
http_port 80 # squid监听的端?br />
httpd_accel_host 172.16.250.250 # 内部WEB服务器的IP地址
httpd_accel_port 80 # WEB服务器的IP地址
httpd_accel_single_host on # 转发为缓冲的hC台单独的机器
httpd_accel_with_proxy on #
httpd_accel_uses_host_header off
如果WEB服务器和反向代理服务器是同一台机器?br />
那么Q应该设|WEB服务器的监听端口为非80端口Q比如:81端口Q。要修改的内容如下:
http_port 80 # squid监听的端?br />
httpd_accel_host localhost # 内部WEB服务器的IP地址
httpd_accel_port 81 # WEB服务器的IP地址
httpd_accel_single_host on # 转发为缓冲的hC台单独的机器
httpd_accel_with_proxy on #
httpd_accel_uses_host_header off
下面解释一下配|指令?/p>
http_port 80
选项 http_port 指定squid监听HTTPh的端口,一般都讄?0端口Q这样用户感觉不到反向代理的存在,像讉K真正的WEB服务器一栗?/p>
httpd_accel_host 172.16.250.250 ?httpd_accel_port 80
选项httpd_accel_host ?httpd_accel_port 指定WEB服务器的IP地址和端口号Q可以根据自qWEB服务器的实际情况而定?/p>
httpd_accel_single_host on
选项httpd_accel_single_host 为on Ӟsquid被设|成仅对单一的web服务器作反向代理。不考虑HTTP头信息,Squid转发所有的未被~冲的页面请求到q个web服务器。如果squid需要做多个web服务器反向代理,必须此选项讄为offQƈ且用{向器或者DNSL请求到合适的后台WEB服务器?/p>

]]>
后台的内容管理系l的面输出遵守可缓存的设计Q这样就可以把性能问题交给前台的缓存服务器来解决了Q从而大大简化CMSpȝ本n的复杂程度?/p>
静态页面的~存可能?UŞ式:其实主要区别是CMS是否自己负责兌内容的缓存更新管理?/p>
静态缓存的~点Q?/p>
在动态缓存模式中Q每个动态页面只需要关心,而相关的其他面能自动更斎ͼ从而大大减了设计相关面更新触发器的需要?br />
以前做小型应用的时候也用过cM方式Q应用首ơ访问以后将数据库的查询l果在本地存成一个文Ӟ下次h时先查本地缓存目录中是否有缓存文Ӟ从而减对后台数据库的讉K。虽然这样做也能承蝲比较大的负蝲Q但q样的内容管理和~存理一体的pȝ是很隑ֈȝQ而且数据完整性也不是很好保存Q内Ҏ新时Q应用需要把相应内容的的~存文g删除。但是这L设计在缓存文件很多的时候往往q需要将~存目录做一定的分布Q否则一个目录下的文件节点超q?000Qrm *都会出错?/span>
q时候,pȝ需要再ơ分工,把复杂的内容理pȝ分解成:内容输入和缓存这2个相对简单的pȝ实现?br />
所以分工后Q内容管理和~存理2者,无论哪一斚w可选的余地都是非常大的QYӞ比如前台80端口使用SQUID对后?080的内容发布管理系l进行缓存)Q缓存硬Ӟ甚至交给akamaiq样的专业服务商?br />
面向~存的站点规?/strong>
一个利用SQUID对多个站点进行做WEB加速http accelerationҎQ?br />ZApache mod_proxy的反向代理缓存加速实?/strong>
Apache包含了mod_proxy模块Q可以用来实C理服务器Q针对后台服务器的反向加?br />ZSquid的反向代理加速实?/strong>
Squid是一个更专用的代理服务器Q性能和效率会比Apache的mod_proxy高很多?br /> 如果需要combined格式日志补丁Q?br /> http://www.squid-cache.org/mail-archive/squid-dev/200301/0164.html
可缓存的动态页面设?/strong>
什么样的页面能够比较好的被~存服务器缓存呢Q如果返回内容的HTTP HEADER中有"Last-Modified"?Expires"相关声明Q比如:<%
' Set Expires Header in minutes
Function SetExpiresHeader(ByVal minutes)
' set Page Last-Modified Header:
' Converts date (19991022 11:08:38) to http form (Fri, 22 Oct 1999 12:08:38 GMT)
Response.AddHeader "Last-Modified", DateToHTTPDate(Now())
' The Page Expires in Minutes
Response.Expires = minutes
' Set cache control to externel applications
Response.CacheControl = "public"
End Function
' Converts date (19991022 11:08:38) to http form (Fri, 22 Oct 1999 12:08:38 GMT)
Function DateToHTTPDate(ByVal OleDATE)
Const GMTdiff = #08:00:00#
OleDATE = OleDATE - GMTdiff
DateToHTTPDate = engWeekDayName(OleDATE) & _
", " & Right("0" & Day(OleDATE),2) & " " & engMonthName(OleDATE) & _
" " & Year(OleDATE) & " " & Right("0" & Hour(OleDATE),2) & _
":" & Right("0" & Minute(OleDATE),2) & ":" & Right("0" & Second(OleDATE),2) & " GMT"
End Function
Function engWeekDayName(dt)
Dim Out
Select Case WeekDay(dt,1)
Case 1:Out="Sun"
Case 2:Out="Mon"
Case 3:Out="Tue"
Case 4:Out="Wed"
Case 5:Out="Thu"
Case 6:Out="Fri"
Case 7:Out="Sat"
End Select
engWeekDayName = Out
End Function
Function engMonthName(dt)
Dim Out
Select Case Month(dt)
Case 1:Out="Jan"
Case 2:Out="Feb"
Case 3:Out="Mar"
Case 4:Out="Apr"
Case 5:Out="May"
Case 6:Out="Jun"
Case 7:Out="Jul"
Case 8:Out="Aug"
Case 9:Out="Sep"
Case 10:Out="Oct"
Case 11:Out="Nov"
Case 12:Out="Dec"
End Select
engMonthName = Out
End Function
%>
参考资料:
HTTP代理~存
http://vancouver-webpages.com/proxy.html
可缓存的面设计
http://linux.oreillynet.com/pub/a/linux/2002/02/28/cachefriendly.html
相关RFC文档Q?br />
可缓存性检查:
http://www.web-caching.com/cacheability.html