|
一.基础篇
1.下载源代码并解压
cd /opt/software
wget -c http://www.squid-cache.org...
tar -zxvf squid-2.5.STABLE14.tar.gz
2.安装Squid Proxy Server
cd /opt/software/squid-2.5.STABLE14
./configure --prefix=/usr/local/squid
3. 设置squid.conf,内容如下
http_port 80
# squid 的端口
cache_dir aufs /usr/local/squid/var/cache 250 16 256
# 缓存目录:/cache 类型:ufs 大小:250mb 允许Squid在目录下建立一级(16)和二级目录(256)
cache_mem 64 MB
# cache内存大小:64mb
cache_store_log /var/log/squid/store.log
#Squid的日志1:在/var/log/squid下,注意此目录的权限
cache_access_log /var/log/squid/access.log
#Squid的日志2:在/var/log/squid下,注意此目录的权限
cache_log /var/log/squid/cache.log
#Squid的日志3:在/var/log/squid下,注意此目录的权限
### cache user
cache_effective_user nobody #缓存用户UID
cache_effective_group nobody #缓存用户组 GID
### cache admin
visible_hostname www.phpme.com
#发生错误时,生成提示所显示的缓存服务器名
cache_mgr caminero.yang@gmail.com
#发生错误时,生成提示所显示的缓存服务器管理员名
acl badurls dstdomain popme.163.com
http_access deny badurls
#以上2句不允许使用该缓存服务器访问popme.163.com
acl badwords url_regex -i sex
http_access deny badwords
#以上2句不允许使用该缓存服务器访问URL正则表达式中含sex字样的URL
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
#httpd 透明代理配置
acl all src 0.0.0.0/0.0.0.0
http_access allow all
4.启动squid
/usr/local/squid/sbin/squid -z #初始化cache目录
/usr/local/squid/sbin/squid
以下信息可以参考判断问题
squid -k parse #检查配置是否有错误,没有任何输出,证明配置基本是正确的!!!
squid -zX #可以加一个X参数,看看初始化具体的项目.
如果因为DNS无法启动squid,可以用下面的命令启动squid
squid –D
如果发现启动了一下,squid的进程又在进程列表中消失了。可以用下面的命令
squid -NCd2
5.设置hosts将需要cache的网址指向我们要指向的ip,再通过ie访问,就可以发现已经成功的配置squid了。
二.升级篇
1.限制可以cache的域名
修改squid.conf文件,最后一行修改为:http_access deny all
前面加上以下内容:
acl allowurls dstdomain blog.cnfol.com
http_access allow allowurls
#以上2句只允许使用该缓存服务器访问blog.cnfol.com
原理说明:需要理解一下squid的读取配置的方式。Squid将使用allow-deny-allow-deny……这样的顺序套用规则。例如,当一个用户访问代理服务器时, Squid会顺序测试Squid中定义的所有规则列表,当所有规则都不匹配时,Squid会使用与最后一条相反的规则。当定义了允许的规则,再定义一条deny的规则,则deny的规则不会生效。也就是说,在最后一条加上deny all可以保证只有在指定规则范围内才能使用。
2.限制cache的时间
refresh_pattern ^http: 5 20% 50
#限制当网址是以http:开头的,那么在5分钟后,cache内的数据会被更新
说到这个问题,不得不说一下我在学习过程中发现的一个情况,FF中查看header几乎全部的请求都是miss,查看access.log发现状态是tcp_refresh_hit(关于状态说明此处不做详解),但是IE下吐出的头却是hit,状态时tcp_ims_hit。猜想可能是两个浏览器送出的头不同。对比两个头
FF:
IE:
3.限制可以cache的网址规则
设置带?号的网址不cache:在squid.conf中加入以下几行
acl badwords urlpath_regex -i ?
http_access deny badwords
#以上2句不允许使用该缓存服务器访问URL正则表达式中含?字样的URL
注意:若发现未生效,请更换一下此语句的位置,当存在多个http_access的时候,位置不同也会造成问题,具体我们以后再研究。
设置特殊规则的网址不cache
以博客为例,只想cache文章页(http://blog.cnfol.com/aa/1...,其他页面都不cache
acl articleurl url_regex -i ^http://blog.cnfol.com/([0-9a-zA-Z_]+)/article/([0-9]+).html
http_access allow articleurl
acl badwords urlpath_regex -i .+
http_access deny badwords
#以上4句只允许使用该缓存服务器访问文章页
写了以上两个规则以后发现,当url不符合我们规则时时,访问结果都变成403了,这显然不是我们需要的结果,我们再看要如何修改
Squid有一个no_cache的命令,可以指定规则不进行cache,如:
acl articleurl url_regex -i ^http://blog.cnfol.com/shtml/([0-9]+).shtml
no_cache deny articleurl
#这样就不会cache我们指定的页面了。
接下来,我们试试看,如果我们希望只cache其中的某个规则的页面,而其他页面都不cache规则要如何来写
acl allowurl url_regex -i ^http://blog.cnfol.com/shtml/19.shtml
no_cache allow allowurl
acl denyurl urlpath_regex -i .+
no_cache deny denyurl
#以上四句的意思相信不用我再解释了吧
4.根据不同的规则设置不同的cache时间
refresh_pattern .shtml$ 5 10% 5 ignore-reload
#限制当网址是以.shtml结尾的,那么在5分钟后,cache内的数据会被更新,但是我测试似乎结果并非如此
5.防盗链设置
acl picurl url_regex -i .bmp$ .png$ .jpg$ .gif$ .jpeg$
acl mystie1 referer_regex -i ^http://blog.cnfol.com
http_access deny !mystie1 picurl
#以上是防盗链设置,这里拒绝了不是从blog.cnfol.com过来的请求
#这句必须放在下面的语句之上,因为squid匹配条件的规则是按照自上而下的顺序,当匹配到允许或者拒绝的条件,就不会向下继续进行匹配,故限制条件应放在通配条件之上
acl articleurl url_regex -i ^http://blog.cnfol.com/shtml/([0-9]+).([a-zA-Z0-9]+)
http_access allow articleurl
上面的说明,可能有做过apache的rewrite的人会比较容易理解,我之前也被规则的顺 序困扰了很久,其实这个就是一个正常的程序员的思路,找到符合当前的规则就跳出, 否则继续向下。
6.根据头信息判断页面是否需要cache
上面已经说了我们可以通过refresh_partern来配置特定网址的过期时间。在Squid的手册上有这样一段话:refresh_pattern规则仅仅应用到没有明确过时期限的响应。原始服务器能使用Expires头部,或者Cache-Control:max-age指令来指定过时期限。也就是说,我们可以通过服务器输出头信息来控制此cache的cache时间。如何控制呢?看下面的代码
$offset = 60;
$ExpStr = "Expires: " .gmdate("D, d M Y H:i:s", time()+$offset) ." GMT";
header($ExpStr);
header("Last-Modified:". gmdate( 'D, d M Y H:i:s' ) . " GMT" );
#header("Cache-Control: max-age=".$offset);
#header("Cache-Control: public");
# Basic认证的网页若需要缓冲须用public的头
echo '
';
print_r(getallheaders());
?>
这段代码里面指定了页面的过期时间和最后修改时间。这样squid会按照这里指定的过期时间来控制cache的时间,而不会按照refresh_pattern的设置。
我在测试过程中,一开始只是使用了Expires,而没有使用Last-Modified,结果发现每次的结果都是tcp_miss,加了Cache-Control也没用,那么,我们要如何理解这几个参数(包括squid会返回的一个Date参数)与对squid的判断作用呢?
Date:指squid从realserver中获得数据的时间
Last-Modified:一般指页面生成的时间
Expires:页面指定的过期时间
由于指定了过期时间,但未制定生成时间,我猜想squid会默认一个生成时间值,很可能是1970年1月1日,所以这个铁定是会被认为过期的,于是我们每次都会看到都miss了。而后来加了一个生成时间,判断无误。
说到这里,我想有必要再回过头去说要一下refresh_parttern这个配置。
refresh_pattern语法如下:
refresh_pattern [-i] regexp min percent max [options]
#-i 是用来控制是否区分大小写的,min和max的单位是分钟,percent是百分比
对于一个cache是否过期,squid会这样计算,
If ((CURRENT_DATE-DATE(就是LM里定义的时间)) < min),cache是新鲜的
else if ((CURRENT_DATE-DATE) < (min + (max-min)*percent),cache是新鲜的
else cache是过期的
有一点一定要记住::refresh_pattern规则仅仅应用到没有明确过时期限的响应。原始服务器能使用Expires头部,或者Cache-Control:max-age指令来指定过时期限。所以,上面说的公式并不适用于有输出Expire和Last-Modified头的页面。
说到这里,我们再回过头来看FF和IE的问题,为什么IE可以hit而FF不行呢?
对比squid发给realserver的头,我们发现,ff请求的时候,squid请求(对realserver)头Cache-Control:max-age=0;而IE则是Cache-Control:max-age=960。
实际情况是这样,当第一次请求的时候,request中不会有max-age,而此时若squid中有所请求的资源未过期的拷贝,则squid会将拷贝返回给浏览器,这个是没问题的。问题出在,当第二次请求,本地的FF中已经包含了一个cache,此时FF会向squid发起请求要求验证本地cache是否有效,于是squid再次在服务器寻找cache,squid找到了一个貌似过期的资源,出现TCP_REFRESH_MISS状态。这样前台便出现miss的情况。但是,这样的情况为什么只出现在FF,而IE不会呢?我想是不是与响应头有关,在查看hit的时候返回的响应头
FF
IE
7.如何清除cache
有时候,我们可能想根据一定的规则清除cache住的一些资源,可以通过下面的方法实现:
1.squid –z重建cache区
2. squid清空缓存
# /usr/local/squid/sbin/squid -k shutdown 关闭squid
# echo "" > /usr/local/squid/var/cache/swap.state 写入一些垃圾数据到这个文件
# echo "" > /usr/local/squid/var/cache/swap.state 如果有多个....
#/usr/local/squid/sbin/squid –z
#/usr/local/squid/sbin/squid
如果你有多个cache目录,请为每个cache目录下的swap.state文件执行上门的命令
不能直接删除swap.state命令,或者是把这个文件清为0,需要写一些垃圾数据到这个文件中
3.还有一种比较夸张的方法,清除 URL 以“.mp3”结尾的缓存文件
#./purge -p localhost:80 -P 1 -se '.mp3$'(未验证)
三.高级篇
1. 什么是squid的命中率,如何分析squid当前的运行状态
在实际测试当中,在日志中发现的最多种的状态(除了MISS以外的)是:
TCP_REFRESH_HIT:指squid发现cache中存在资源的拷贝,但不知是否新鲜的,向realserver发起了一次确认,realserver指出该拷贝是新鲜的
TCP_IMS_HIT:指浏览器向squid发起请求,squid指出浏览器本地cache是新鲜的
TCP_MEM_HIT:指squid在cache中发现存在资源的拷贝,并返回给浏览器
除了下面两种状态以外,其他都应该是未命中状态。下面介绍一款squid命中率监控软件squid-graph
下载包:http://sourceforge.net/pro...
解压后直接就可以使用。但是需要perl的gd的支持
GD的安装:http://stein.cshl.org/www/...,下载后解压
perl makefile.pl
make
make install
接下来,编辑apache的配置文件,加入访问路径
Alias /squid-graph /var/www/squid-graph
Order deny,allow
Allow from all
弄好上面的步骤以后,我们要利用工具开始分析日志
./squid-graph -o=/var/www/squid-graph/ < /var/log/squid/access.log
具体命令的意思就不多说了
分析完成以后就可通过http://ip/squid-graph来进行查看squid的命中率统计了。
2.squid的cache存储结构
3.如何查看squid当前的运行状态
四.技巧学习
1.注意观察日志文件,日志文件中有状态码,可以协助你判断此时cache的性能
版权声明:本文为博主原创文章,未经博主允许不得转载。 |
|
|