大规模网站架构之WEB加速器SQUID(二)

引言
   大规模网站瓶颈之一就是性能问题,如何让你的网站飞速运转起来,一直是架构师和开发人员苦于思考的问题,随着CMS的成熟,大多数门户及网站都通过静态化来提升网站的性能和安全,但随之而来CMS管理发布也变得越复杂,如何能使发布的信息快速被用户访问,如何方便灵活定义一种策略,使缓存随着应用的变化变化,成了我亟待解决的问题。
本文仅针对基于asp.net开发的网站交互性非实时部分进行讨论,实时交互部分解决方案将在后续部分予以阐述。

一、WEB加速通常有如下方案:

1、基于asp.net技术的页面缓存
基于.net技术的页面缓存,通常有如下两种应用方式:
一、基于数据库触发(设置缓存依赖策略,当数据库中数据发生变化时,触发缓存失效;但微软提供的解决方案目前仅支持SQL Server,如果是ORACLE需要自己实现触发接口)。
二、基于文件依赖的策略(可以设置缓存依赖于文件中的具体键值,当数据更新时,更新文件键值迫使缓存失效)。
优点:实现比较简单
缺点:粒度太粗,对IIS、.net Framework依赖太强,策略还不太完善,跨机器、集群访问方面存在瓶颈。

2、页面静态化
页面静态化有可分为全部静态化、局部静态化、伪静态化等。
优点:页面静态化后,减轻了数据访问的负担,同时由于静态页面不需要复杂处理过程(如ASP.NET页面生命周期),从而提高网站的性能。
缺点:页面静态化增加了维护管理的复杂度,可能同一页面在多个页面之间被引用,需要进行触发级连更新。当大量并发时,更新静态页面会发生LOCK,导致页面访问超时。

 

3、基于squid for windows下的反向代理
   为了佐证本方案是经过实践考验的,并且是通用的行业方案,以下是我通过抓包得到的一些大规模网站实际应用:
--网易
Server nginx
Date Wed, 10 Mar 2010 02:25:39 GMT
Content-Type text/html; charset=GBK
Last-Modified Wed, 10 Mar 2010 02:24:45 GMT
Vary Accept-Encoding
Expires Wed, 10 Mar 2010 02:27:39 GMT
Cache-Control max-age=120
Content-Encoding gzip
Age 49
X-Cache HIT from cache.163.com
Via 192.168.51.39.nginx, 1.0 cache.163.com (squid/3.0.STABLE23)
Connection close

--腾讯
Server nginx/0.6.39
Date Wed, 10 Mar 2010 02:26:48 GMT
Content-Type text/html; charset=GB2312
Vary Accept-Encoding, Accept-Encoding
Expires Wed, 10 Mar 2010 02:41:48 GMT
Cache-Control max-age=900
Content-Encoding gzip
Age 313
X-Cache HIT from rainny.qq.com
Via 1.0 rainny.qq.com:80 (squid/2.6.STABLE5)
Connection close


----搜狐
Date Wed, 10 Mar 2010 02:41:40 GMT
Server Apache/1.3.39 (Unix) mod_gzip/1.3.26.1a
Vary Accept-Encoding,X-Up-Calling-Line-id,X-Source-ID,X-Up-Bearer-Type
Cache-Control max-age=70
Expires Wed, 10 Mar 2010 02:42:50 GMT
Last-Modified Wed, 10 Mar 2010 02:41:39 GMT
Content-Type text/html
Age 9
X-Cache HIT from 17376722.22226606.29245568.sohu.com
Via 1.0 17376722.22226606.29245568.sohu.com:80 (squid)
Connection close


4、其它

二、SQUID简介


SQUID 简单说来是基于UNIX下开发的为WEB应用加速的一个开源软件。SQUID已经普遍在基于nix系统下的WEB应用中使用,例如:新浪、网易都使用该软件,其中SQUID FOR WINDOWS是在WINDOWS下使用。SQUID通过哈希算法在磁盘上建立目录,将第一次请求的信息,存在指定的目录下,供其下次存取,此外SQUID也会将请求的页面信息缓存在内存中,当客户端访问某一页面时,如果内存中存在,则直接命中CACHE;如果内存中不存在,则到CACHE目录下获取,否则到后端的WEB  SERVER获取。

SQUID 特点:

1、SQUID沿继了nix下配置的风格,可能用惯了WINDOWS的用户初次使用会有些不适。
2、SQUID包括了一系列的配置策略,认证、访问控制、缓存设置、URL抓取、日志管理、磁盘管理、群集等。
3、SQUID可以通过refresh_pattern策略设置请求的URL可缓存的内容,失效时间(详见文档)。

4、缓存策略说明

SQUID使用了LM算法,LM就是页面Header里时间(Date)和Last-Modified时间的差。Date一般是Squid从后面取页面的时间,Last-Modified 一般是页面生成时间。

refresh_pattern 的语法是

refresh_pattern [-i] regexp min percent max [options]

 

min, max的单位是分钟,percent就是百分比。

refresh_pattern 的算法如下:(当前时间定义为CURRENT_DATE)

1) If ((CURRENT_DATE-DATE(就是LM里定义的时间)) < min),cache是新鲜的

2) else if ((CURRENT_DATE-DATE) < (min + (max-min)*percent),cache是新鲜的

3) else cache是过期的

cache过期就需要从后面server取新鲜内容。

常用的几个参数的意思

override-expire

该选项导致squid在检查Expires头部之前,先检查min值。这样,一个非零的min时间让squid返回一个未确认的cache命中,即使该响应准备过期。

 

override-lastmod

改选项导致squid在检查LM-factor百分比之前先检查min值。

 

reload-into-ims

该选项让squid在确认请求里,以no-cache指令传送一个请求。换句话说,squid在转发请求之前,对该请求增加一个If-Modified- Since头部。注意这点仅仅在目标有Last-Modified时间戳时才能工作。外面进来的请求保留no-cache指令,以便它到达原始服务器。

一般情况可以使用 reload-into-ims。它其实是强行控制对象的超时时间,这违反了http协议的精神,但是在带宽较窄的场合,可以提高明显系统相应时间。 


关于SQUID FOR WINDOWS介绍已经很多,本文就不在赘述,详见SQUID权威手册这本书。

在使用SQUID之前,首先要规划或确定你现有布署环境,如果你是Single Web Server 建议你在Web Server前增加一台机器做为SQUID服务器


三、SQUID FOR WINDOWS配置

   本文中SQUID放在172.20.65.201的机器上,应用WEB SERVER IP为172.20.65.203,其中SQUID在201上的80端口侦听,测试客户端机器为172.20.65.231,在squid.conf中#代表注释,所以开启某项设置,需去掉前面的#。TAG标签代表每一功能项的设置。

1、下载
   下载SQUID FOR WINDOWS(我所用的版本是Squid 2.7.STABLE6,各个版本的配置可能略有不同,大家请注意)

2、安装
   将SQUID解压到c:/squid(当然也可解压在其它盘符下)

3、建立磁盘缓存和日志目录
   默认情况是在安装磁盘下建立,为确保性能大幅度提升,建立选择磁盘空间容量较大的盘符,如:建立d:/squid/var目录,在var目录下建立logs和cache目录,其中logs目录用   于存放日志,cache目录用于存放硬盘缓存数据。

4、建立缓存目操作权限
   为了使抓取的数据,能够存放在缓存目录下,建立系统账户如squidApp,将其属于普通用户组应可,将d:/squid授予该用户读写权限即可。
   
5、文件更改
   c:/squid/etc是SQUID的配置信息的存放处,为确保安全,在你修改配置文件前,请将其备份,然后将squid.conf.default修改为squid.conf,
   mime.conf.default修改为 mime.conf ,cachemgr.conf.default 修改为cachemgr.conf

6、配置SQUID
   针对于SQUID来讲大部分配都在squid.conf中,本文中所使用环境如下:

   开启如下访问控制
   acl all src all
   acl manager proto cache_object
   acl localhost src 127.0.0.1/32
   acl to_localhost dst 127.0.0.0/8
   acl localnet src 172.16.65.231/255.255.0.0 指定本地网络及掩码

   开启访问端口
   acl SSL_ports port 443
   acl Safe_ports port 80 # http
   acl Safe_ports port 21 # ftp
   acl Safe_ports port 443 # https
   acl Safe_ports port 70 # gopher
   acl Safe_ports port 210 # wais
   acl Safe_ports port 1025-65535 # unregistered ports
   acl Safe_ports port 280 # http-mgmt
   acl Safe_ports port 488 # gss-http
   acl Safe_ports port 591 # filemaker
   acl Safe_ports port 777 # multiling http
   acl CONNECT method CONNECT

   开启访问控制,请一定要注意顺序
   http_access allow manager localhost
   http_access deny manager
   http_access deny !Safe_ports
   http_access deny CONNECT !SSL_ports
   http_access allow all
   http_access allow localnet
   http_access deny all

   指定SQUID在80端口侦听, vhost 指定使用加速模式
   http_port 80 vhost 

   203后台WEB SERVER, parent指父节点, 80 指后台网站的端口, 0 ICP 服务端口,no-query  originserver 获取缓存时的选项
   cache_peer 172.20.65.203       parent    80  0  no-query  originserver

   缓存设置
   maximum_object_size_in_memory 1024 KB
   cache_dir ufs d:/squid/var/cache 1024 16 256 注意路径
   maximum_object_size 4096 KB
   cache_swap_low 90
   cache_swap_high 95

   日志设置
   access_log d:/squid/var/logs/access.log squid 访问日志
   cache_log d:/squid/var/logs/cache.log
   cache_store_log d:/squid/var/logs/store.log
   emulate_httpd_log on

   控制页面缓存内容
   refresh_pattern ^ftp: 1440 20% 10080
   refresh_pattern ^gopher: 1440 0% 1440
   refresh_pattern -i (/cgi-bin/|/?) 0 0% 0
   refresh_pattern . 0 20% 4320
   refresh_pattern -i /.css$ 20 50% 120 reload-into-ims
   refresh_pattern -i /.xml$ 20 50% 120 reload-into-ims
   refresh_pattern -i /.html$ 20 90% 120 reload-into-ims
   refresh_pattern -i /.jpg$ 20 90% 120 reload-into-ims
   refresh_pattern -i /.png$ 20 90% 120 reload-into-ims
   refresh_pattern -i /.gif$ 20 90% 120 ignore-reload
   refresh_pattern -i /.js$ 20 90% 120  reload-into-ims
   refresh_pattern -i /.htm$ 20 90% 120 reload-into-ims
   
   设置邮箱
   cache_mgr webmaster_breeze

   设置本地主机文件
   hosts_file c:/windows/system32/drivers/etc/hosts
   

7、安装服务
   将squid安装为服务,命令格式:squid -i [-f configfile] [-n servicename],如c:/squid/sbin/squid -i -n Squid_Proxy

8、初始化缓存目录 
   c:/squid/sbin/squid -z 
 
9、启动Squid_Proxy服务 
   运行services.msc打开服务窗口,选择Squid_Proxy服务 ,如果启动过程出错90%是配置文件出现问题。

10、squid命令 
   squid -k reconfigure  //启用新的配置文件 
   squid -k rotate       //截断日志 
   squid -k shutdown     //stop squid 
   squid -dx 当服务不能启动时,进行调试
更多配置请参见文档

四、SQUID测试
找一台机器进行测试,并查看access.log日志,如果出现 TCP_DENY的信息,多为配置不正确。如出现如下信息TCP_MEM_HIT/200 表示,SQUID已经起作用,该请求是从 SQUID运行机器的内存中响应的。

 

五、性能

用LR跑了一下,1000个并发,内存命中率在100%。下次把测试结果贴上。 

 

 

3
1
(请您对文章做出评价)
« 上一篇: 大规模网站架构实战之体系结构(一)

posted on 2010-03-15 14:07 design-life 阅读(888) 评论(14)   编辑 收藏


评论:

#1楼 2010-03-15 14:21 | Ray Wu       
不错,有机会会应用在产品服务器上
   回复   引用   查看     
#2楼 2010-03-15 14:23 | 风云幻影       
写的不错,顶下。但是很遗憾没看到具体的测试数据对比,还有,楼主比较过SQUID和Memcache两者之间的性能差异吗?
   回复   引用   查看     
#3楼 2010-03-15 14:30 | 代震军       
@风云幻影
squid主要用于‘缓存静态文件’使用的,比如JPG,GIF,JS,CSS等,与MEMCACHED不是一类东西,呵呵。

   回复   引用   查看     
#4楼 2010-03-15 14:43 | Jon.Hong       
好文, 作个记号。。。。
另外请问博主,有更多squid的资料吗?

   回复   引用   查看     
#5楼 2010-03-15 14:53 | TT.Net       
squid用做的服务器是内存放不下了再去访问目录吗?
那就是服务器配置要内存大 硬盘大。CPU一般就可以了吗?
外网是访问SQUID这台的80吗?

   回复   引用   查看     
#6楼 2010-03-15 14:55 | Jon.Hong       
@代震军
有个问题想请教,谢谢

用squid缓存图片,如果源图片已经删除或重新上传,squid服务器是怎么更新的呢?

   回复   引用   查看     
#7楼 [ 楼主] 2010-03-15 15:01 | design-life       
@TT.Net
SQUID可以设置内存、磁盘大小,当内存不能命中时,检索磁盘,由于使用了Hash技术,索引速度飞快,SQUID其实可以看作反向代理,可以设置在80端口侦听。

   回复   引用   查看     
#8楼 2010-03-15 15:02 | TT.Net       
@design-life
期待你的下一篇

   回复   引用   查看     
#9楼 [ 楼主] 2010-03-15 15:05 | design-life       
@Jon.Hong
网上有SQUID权威指南中文版的PDF,你可以下载看看,很全。
SQUID更新缓存的策略符合W3C标准,主要用到了last-moidfy和LM算法

   回复   引用   查看     
#10楼 2010-03-15 15:44 | 代震军       
@Jon.Hong
SQUID有个客户端文件叫:squidclient(有下载包中),你可以使用其中的purge指令来删除缓存文件,这样后续访问就会重新读取了,形如:
[root@www etc]# /usr/local/squid/bin/squidclient -p 80 -m PURGE http://www.abc.com/images/index/jdt/images/2.jpg


   回复   引用   查看     
#11楼 2010-03-15 15:47 | 代震军       
@Jon.Hong
另外,如果网站使用NGINX做的lb的话,那可以使用其原生态的插件来做静态文件缓存,效率也很高,下面这篇文章中有详细描述,
http://blog.s135.com/nginx_cache/

   回复   引用   查看     
#12楼 2010-03-15 15:52 | Jon.Hong       
@代震军
谢谢。

   回复   引用   查看     
#13楼 2010-03-15 16:16 | killkill       
squid 不错,可以为缓存设定策略,感觉上唯一缺陷的地方是不能支持多CPU ......
   回复   引用   查看     
#14楼 2010-03-15 16:34 | 肥燕子       
"acl localnet src 172.16.65.231/255.255.0.0"
指定本地网络及掩码,我感觉有误吧,按照楼主的配置,本地的网络应该是172.16.65.0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值