| Subcribe via RSS

SQUID动态URL日志不完整的问题

10月 17th, 2008 | 2 Comments | Posted in Squid < by ready >

SQUID 2.6.STABLE6

logformat combined %>a %ui %un [%tl] "%rm %ru  HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh %tr
access_log /home/squid/log/access.log combined

问题:
当访问的URL为:http://www.hiadmin.com/xxx.php?codetin=pig时:
日志为:

222.68.179.90 - - [18/Oct/2008:00:52:00 +0800] "GET http://www.hiadmin.com/xxx.php?  HTTP/1.1" 304 299 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)" TCP_IMS_HIT:NONE 0

URL后面的:codetin=pig 丢失了。

解决方法:
在squid.conf中添加:

strip_query_terms off

重新reload squid,日志正常。

strip_query_terms
默认为开启。是为了保护用户的隐私,而不在日志中记录“?”后面的参数。

阅读内文

Squid日志拆分shell

9月 9th, 2008 | 4 Comments | Posted in Linux, Squid, shell < by ready >

vi split_log.sh

#!/bin/sh
count=$#
if [ $count -le 0 ]
then
echo “please input date”
exit
fi
filename=”access.log”

cd ~weblog/

if [ ! -d ./$1 ]
then
mkdir ./$1
fi

cd ./$1

rm * -f

zcat ../$filename.$1.gz | gawk -F ‘[ /]‘ ‘ {dom=$11;print $0 >> dom}’

for file in ./*
do
if [ -s $file ]
then
gzip $file
else
rm $file -f
fi
done

参数使用的是长格式日期
例如:
./split_log.sh 20080909

在产生的日志中会出现一些莫名其妙的域名日志,这是由于有人非法使用squid做代理造成的。这样的情况在配置禁止非法代理也一样会发生。

阅读内文

一次网上面试经历

9月 7th, 2008 | 16 Comments | Posted in Squid, 生活随笔 < by Martian Guo >

应朋友介绍,有幸在网上接受了一家国内比较著名的网络公司的面试,其实这家公司之前已经接触过两次,对于这次面试,和上两次一样,至少自己是不满意的,感觉自己仍旧欠缺很多东西,先把这次面试的问题说一下

  • 你认为组成web站点体系有哪些元素?
  • 这样的配置,在apache起来后会有几个子进程? (别把这个问题想的简单化)
    <IfModule mpm_prefork_module>
    StartServers 5
    MinSpareServers 50
    MaxSpareServers 100
    MaxClients 150
    MaxRequestsPerChild 0
    </IfModule>
  • 在apache的worker MPM中,为什么ServerLimit要放到配置段最前面?
  • 千兆网卡的极限pps是多少?是如何算出来的?
  • 为什么lighttpd,nginx的并发性能比apache要高?
  • top命令里running的值表示什么意思?这个值和CPU数有什么关系?
  • 在http header头里看到的:Last-Modified,Expires,max-age,etag这四者有什么关系?
  • 一个web站点,如何计算所需要的带宽?公式是什么?
  • 如何看http的并发连接数的?
  • FIN_WAIT2是在什么状态?
    iostat看到的:
    wsec/s = 600
    那么wKB/s = ?
  • 当打开apache的mod_status后,可以通过http://ip/server-status看到相关的状态值,那么Srv, Acc, M,SS,Req各表示什么含义?
  • 如何计算客户端到服务器段的带宽?

对于上面这些问题,也说不上有多难,很多问题google上都能够找到,而且对于系统运维人员来说这些内容是必须了解的,但是你说仅仅是了解,恐怕也不够,其实很多东西不是说没接触过,而是都做过和接触过,但没有深入的去研究过,只知其然 而不知其所以然,感觉做我们这行的,需要掌握的知识面是相当广泛的,大到网络应用架构到,小到一个命令的参数,一个脚本编写,你都要知道,知识是需要积累的,但也需要你怎么运用他,我们很多时候所做的仅仅是如何用,而没有去考虑为什么要这样用,比如说技术文档,有多少人会仔细的查看MAN帮助,有多少人去研究过RFC文档?再比如说简单的iptables应用,一般很少会过多的去考虑当使用了iptables 后会对tcp连接产生多大的影响,可能在等到出现 “ip_conntrack: table full, dropping packet.”的情况下才会去检查问题的所在,很多人会觉得这些东西都是需要经验的,你碰到过这个问题就知道,没有碰到过就不知道,就如上面的问题,假如你的服务器每天就几千连接,恐怕你是一辈子都不会碰到这个问题的。道理是这样,但我们是不是也应该多了解一下这么做合理性,可能会出现什么问题。一个架构的实施一个软件的应用,不是简单的把它部署运行起来,我们应该考虑更多的问题。像我们blog的Johnny Woo同学,他考虑的问题就比我要深入的多,比如说他经常会做一些测试,各种WEB服务器,缓存服务器的性能测试,一些架构技术的研究,我想知识的积累就是如此,不是等待问题的出现,而是自己去找出可能会出现问题,GOOGLE提供给了我们一个非常巨大的知识库,我们如何把别人共享的知识转化成我们自己掌握的知识,关键还是在于实践,在于自己去找问题。还有一点,环境因素,就如上面说的,如果你的环境是每天只有几千人的访问量,你可能不会太多的去关注性能方面的问题,而即使关注,也仅仅是靠自己做一些实验测试而不能真正在生产环境下检验,这也是其中的一个问题,但关键一点还是在于自己,一个问题,一个技术是否是想继续深入的去了解呢,还是仅仅满足现在的要求而不考虑其他方面了。我想,我现在所欠缺的应该就是这些了。

另外再讨论一个问题:我们每天接触的最多的是自由软件,在感叹全世界那么多无私的开发者贡献出那么多完美的软件的同时,对于我们能做的难道仅仅是使用这些软件吗?我是相当佩服国内外一些做系统运维的牛人,他们是相当优秀的系统架构师,另外同时也是相当优秀的软件工程师。使用者最了解自己需要什么样的软件,那么对于系统运维,有谁比我们更了解我们需要什么吗?一个好的环境,再加上一份激情,你会有很多事情要做。

以上内容只是我个人的一些感受,希望经常关注我们blog的朋友能提供一些建议,非常感谢。

阅读内文

squid 2.6 round-robin分发后无法限制域名

8月 14th, 2008 | No Comments | Posted in Squid < by Johnny Woo >

原有的配置文件如下

cache_peer 10.11.12.51 parent 80 0 no-query originserver round-robin name=web1
cache_peer 10.11.12.52 parent 80 0 no-query originserver round-robin name=web2
cache_peer 10.11.12.53 parent 80 0 no-query originserver round-robin name=web3
cache_peer 10.11.12.54 parent 80 0 no-query originserver round-robin name=web4
cache_peer 10.11.12.160 parent 80 0 no-query originserver name=content
cache_peer 10.11.12.150 parent 80 0 no-query originserver name=bbs
cache_peer 172.16.10.140 parent 80 0 no-query originserver round-robin name=game1
cache_peer 172.16.10.141 parent 80 0 no-query originserver round-robin name=game2

cache_peer_domain contentchina content.web.com
cache_peer_domain bbs  bbs.web.com
cache_peer_domain game1 game2 game.web.com
cache_peer_domain web1 web2 web3 web4  .web.com
cache_peer_domain web1 web2 web3 web4   web.com

设定不同的二级域名分发到不同的服务器上.
www.web.com能够正确访问.
查看后台链接.每次访问时squid也会正常去连parent服务器,每次都轮询访问
测试game.web.com
返回有很多内容都是404
但是单独访问140以及141都是没有问题
然后发现很多链接分发到了其他web服务器上
看了说明.里面提到round-robin参数会设置一组随机的访问
感觉是写了round-robin的都是一个组
所以将game的去掉round-robin参数

cache_peer 172.16.10.140 parent 80 0 no-query originserver name=game1
cache_peer 172.16.10.141 parent 80 0 no-query originserver name=game2

访问后仍旧发现还是有分发错误的情况
再次查看squid.conf.default
里面的cache_peer_domain的语法如下

#       cache_peer_domain cache-host domain [domain ...]
#       cache_peer_domain cache-host !domain

感觉是否是因为cache-host这里只能写一台服务器而非一组的关系
随将配置文件修改

cache_peer 10.11.12.51 parent 80 0 no-query originserver round-robin name=web1
cache_peer 10.11.12.52 parent 80 0 no-query originserver round-robin name=web2
cache_peer 10.11.12.53 parent 80 0 no-query originserver round-robin name=web3
cache_peer 10.11.12.54 parent 80 0 no-query originserver round-robin name=web4
cache_peer 10.11.12.160 parent 80 0 no-query originserver name=content
cache_peer 10.11.12.150 parent 80 0 no-query originserver name=bbs
cache_peer 172.16.10.140 parent 80 0 no-query originserver round-robin name=game1
cache_peer 172.16.10.141 parent 80 0 no-query originserver round-robin name=game2

cache_peer_domain contentchina content.web.com
cache_peer_domain bbs  bbs.web.com
cache_peer_domain game1 game.web.com
cache_peer_domain game2 game.web.com
cache_peer_domain web1 .web.com
cache_peer_domain web2 .web.com
cache_peer_domain web3 .web.com
cache_peer_domain web4 .web.com
cache_peer_domain web1 web.com
cache_peer_domain web2 web.com
cache_peer_domain web3 web.com
cache_peer_domain web4 web.com

修改后访问game.web.com
问题解决.没有出现404
后台的分发很正常
可能由于cache-host这里写了一组
导致squid并无法辨识进行针对性的分发
随即将所有的分发都分发到所有round-robin服务器上.
因为www.web.com后端的服务器较多.命中的概率较大.
而命中后第二次取出文件即是squid中的缓存文件,所以访问www.web.com时没有发现问题
而game.web.com因为真实服务器比例较小
分发时很多链接分发到其他web服务器.
导致反馈回很多404

阅读内文 Tags: ,

负载均衡环境中和如何设置Expires和Etag

8月 8th, 2008 | 2 Comments | Posted in Apache, Squid < by Martian Guo >

在负载均衡环境中(LVS, LoadBalance)为了减少浏览器数据的重复请求操作,一般需要设置 Http Header 的 Etage 和 Expires 告诉浏览器请求数据是否已过期。以下内容主要考虑Apache+squid 环境

ETag Header是文件修改时间、文件大小和inode号生成的校验(checksum),在多台服务器的负载均衡环境下会因部署内容的inode节点差异造成 ETag 的不同,在多台WEB前端做负载均衡的情况下,会因为请求同一个数据但不同机器的 ETag 而影响了响应. 具体表现为用户在第一次请求某一内容时下载而再次时浏览器会发现ETag不同而再次请求下载.。(再次刷新时查看是否响应码为:304)
对于Apache 可以使用 FileEtag 选项配置
Apache 的默认ETag的值总是由文件的索引节点(Inode)、大小(Size)、最后修改时间(MTime)决定
这里我们只需要去掉Inode即可
FileETag MTime Size
具体关于 FileETag 详细内容可以查看Apache官方文档

Expires用于控制请求文件的有效时间,当请求数据在有效期内时客户端浏览器从缓存请求数据而不是服务器端. 当缓存中数据失效或过期,才决定从服务器更新数据。
可以使用Apache的mod_expires 模块来设置,这包括控制应答时的Expires头内容和Cache-Control头的max-age指令

ExpiresActive On
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/html "access plus 30 minutes"
ExpiresByType text/css  "access plus 30 minutes"
ExpiresByType text/js   "access plus 30 minutes"
ExpiresByType application/x-javascript   "access plus 30 minutes"
ExpiresByType application/x-shockwave-flash     "access plus 30 minutes"

以上设置为 图片文件的有效期为从请求文件开始1个月,html,css,js,flash文件的有效期为从请求文件开始30分钟
这里只是一个常规设置,Apache官方文档 对此设置有详细介绍
当设置了expires后,会自动输出Cache-Control 的max-age 信息,这个数值是expires有效期内的秒数,(一个月的数值为2592000) 在这个时间段里,该文件的请求都将直接通过缓存服务器获取,当然如果需要忽略浏览器的刷新请求(F5),缓存服务器squid还需要使用refresh_pattern 选项来忽略该请求

refresh_pattern -i .jpg  1440 50% 10080 reload-into-ims ignore-reload ignore-no-cache ignore-private

以下为实际输出的HTTP Header信息

Date Thu, 07 Aug 2008 07:27:57 GMT
Server Apache
Last-Modified Fri, 27 Jun 2008 07:18:52 GMT
Etag "df6-b8c8cf00"
Accept-Ranges bytes
Content-Length 3574
Cache-Control max-age=2592000
Expires Sat, 06 Sep 2008 07:27:57 GMT
Content-Type image/jpeg
Age 34241
X-Cache HIT from s1.ihompy.com
Connection keep-alive

对于动态页面的缓存如果不是频繁更新的页面数据,可以在squid缓存,只需要注意两点
1. session : 对于需要缓存的数据,一定要关闭session防止在http header 中包括session id 字段
2. Last-Modified 和 Expires 标记: 一般般纯静态页面本身都会有Last-Modified信息,这是由WEB服务器获取文件的最后修改时间生成的,而动态页面需要默认的输出内容是

Date Thu, 07 Aug 2008 16:58:37 GMT
Expires Thu, 19 Nov 1981 08:52:00 GMT
Last-Modified Thu, 07 Aug 2008 16:58:37 GMT

这里的 Last-Modified 时间和请求文件的时间相同,也就是说该文件总是声明为最新的
在程序中需要输出Last-Modifed 和 Expires信息,比如php

header('Last-Modified: ' . gmdate("D, d M Y H:i:s") . ' GMT');
header('Expires: ' . gmdate ("D, d M Y H:i:s", time() + 3600*24). " GMT");

以上信息设置php文件的过期时间为请求该文件的时间后的24小时(3600*24)


补充 ,以下内容来自 : 扶凯的blog
http://www.php-oa.com/2008/09/05/squidmaxageexpires.html


Squid和Apache中的max-age与Expires的分别

主要重点在于我们要明白一个相对(Expires)一个绝对(max-age).

分别

max-age
max-age是HTTP/1.1中,他是指我们的web中的文件被用户访问(请求)后的存活时间,是个相对的值,相对Request_time(请求时间).
例如:A.html 用户请求时间是18:00,max-age设置的是600的话,相当18:00+600秒过期,也就是相对18:00的时间后面600秒后过期.默认的max-age是由Expires算出来的.

Expires
Expires是HTTP/1.0中的,它比max-age要麻烦点.Expires指定的时间分下面二种,这个主要考虑到apache中设置是A还是M.

1.相对文件的最后访问时间(Atime)
当Apache使用A时间来做Expires时.这样设置时.他就和max-age的值相等,因为max-age是相对文件的请求时间(Atime).

例如:ExpiresByType text/html A600

由上面我们得知,Apache设置Atime时,过期为600秒时.
Expires=18:00+600=18:10
max-age=18:00+600=18:10
得出:Expires=max-age

2.绝对修改时间(MTime)
这又分二种情况,我们来拿A.htm来讲
假设文件的建立时间为18:00.

当用户Request请求为18:00时,过期为600秒
Expires=18:00+600=18:10
max-age=18:00+600=18:10
得出:Expires等于max-age

当用户Request请求为18:20时,过期为600秒

Expires=18:00+600=18:10(因为设置成Mtime时,时间由文件建立时间来决定)
max-age=18:20+600=18:30
得出:Expires不等于max-age

另外要注意,象上面这种清况时,max-age优化,所以过期时间为18:30.

在squid,如果没有指明expires和max-age这二个的截止时间,那它就会使用发式截止时间,如参考 Last-Modified.
其实上面的max-age=18:20+600=18:30,这样算max-age不对,真实环境要这样算,max-age过期为http头中的Age=600过期.
注:Age域值是缓存服务器估计从响应产生或被原始服务器重新证实以来的总时间.age的值是缓存服务器算出来的,原始服务器是没有的.

阅读内文 Tags: , , , , , ,

squid 2.6 编译优化参数

8月 7th, 2008 | 4 Comments | Posted in Squid < by Johnny Woo >

*NIX将TCP/IP也作为文件来访问
而squid 2.6默认的访问文件数是1024
作为运营环境使用.就需要修改最大打开文件数
配置时加上–with-maxfd 参数即可
存储方式使用aufs会加快访问速度.因为使用非同步方式
打开snmp,这样可以从cacti之类的snmp软件中获取相关squid的参数进行监控
打开大文件支持.允许日志文件超过2G

./configure --prefix=/usr/local/squid --with-maxfd=65535 --enable-storeio=aufs,ufs --enable-snmp –with-large-files
阅读内文 Tags: , ,

squid sibling以及取数据顺序

8月 6th, 2008 | 1 Comment | Posted in Squid < by Johnny Woo >

1. 当 Squid Server 没有资料时,会先向 Sibling 的 Squid Server 要资料,如果 Sibling 没资料,就跳过它直接向 Parent 要。
2. 向 Parent 要资料,然後一直等,直到 Parent 给它资料为止(Parent 自己有的资料或上 internet 去拿)。
3. 没有 Parent 时,就自己上 internet 去拿。
4. 如果这三者都拿不到资料,才向用户端回报拿不到资料。

配置
icp_port 3130
icp_access allow all
cache_peer 10.11.12.10 sibling 80 3130 proxy-only

阅读内文 Tags: ,

squid反向代理对后端进行负载均衡

8月 6th, 2008 | 4 Comments | Posted in Squid < by Johnny Woo >

修改squid.conf文件
cache_peer 10.11.12.151 parent 80 0 no-query originserver name=web1 round-robin
cache_peer 10.11.12.146 parent 80 0 no-query originserver name=web2 round-robin
cache_peer_domain web1 web2 .test.com

这样访问squid时,
squid会从后端的实际服务器中挑选一台进行抓取
例子中使用的是RR的方法轮询
squid同时会对后端的健康状态进行检查
如果后端服务器down了
那么squid会从剩余的origin服务器中抓取数据

阅读内文 Tags: , ,

squid无法缓冲gzip数据问题

7月 9th, 2008 | 5 Comments | Posted in Squid < by Johnny Woo >

一.
squid 2.6由于不支持http/1.1
所以对于vary的头部信息无法提供有效辨认
导致经过apache deflate模块压缩的文件
例如js,css等
前端的squid无法进行缓冲
每次都会导致miss
在shellmy的博文[Squid缓存命中率调整惨痛教训]
作者提到在加入http_vary改为on后.发现那些被压缩对象变成hit.
我们复现了这种情况,但是发现其中有个一个问题
他所作测试的流程如下

gzip压缩->miss
不使用压缩->hit
打开http_vary on
打开gzip压缩->hit

这里有一点.在对httpd取消压缩并且测试有效,修改squid参数之后
他并没有删除缓冲对象然后测试
而是直接就进行了测试
这时候的命中,其实是squid使用上次缓冲的未压缩数据.
我们在使用压缩表现出命中之后,重建了squid的缓冲目录
之后打开http_vary.再对gzip压缩数据进行测试
结果发现.squid仍然全部miss
而且通过squid的配置文件我们发现.http_vary参数.默认就是打开的.
最终这篇博文所表现的结果
只是squid仍旧使用上次未压缩数据所表现出的假象
http_vary对squid 2.6缓冲gzip对象没有任何作用.

二.
彭勇华的博文[Squid支持内容encoding否?]中提到2.7对于HTTP/1.1的支持已经改善

这实际上取决于squid是否支持http/1.1.squid对http/1.1的兼容性代码还在开发之中.不过squid-2.7版本在这方面已做了不少工作.
如果只想配置squid作为反向代理,那么编译安装最新版的squid-2.7(该版本已包含部分http/1.1协议的补丁),在squid.conf的http_port指令后加多一个关键字http11即可,如:
http_port 80 accel vhost http11 defaultsite=www.mytest.com
这样squid就基本兼容encoding了,可以在apache上配置mod_deflate来使用gzip压缩.
不过这种情况对http/1.0的客户端可能有点问题.要完全兼容http/1.0,需要配置下apache的mod_rewrite,基于 Accept-Encoding头部进行rewrite.如果客户端声称接受encoding,那么就使用mod_deflate来压缩内容.如果客户端不接受encoding,那么rewrite规则返回302,指示客户端跳转到另一个目录.该目录不过是前述mod_deflate目录的一个符号链接, 但针对该目录没有配置mod_deflate进行压缩.这样就可解决http/1.0客户端的问题.
当然,只有apache2.2版本才支持基于Accept-Encoding头部进行rewrite,apache2.0也可以做到,不过需要使用一个我自己写的filter(工作在apache的Fixup阶段,原理跟mod_rewrite类似).详细实现方法可询问本人.

根据这篇文章,我们测试了2.7的改进中提到了对http/1.1的支持
安装squid 2.7并且对配置文件进行修改之后

http_port 80 accel vhost vport http11

从curl中看出客户端的协议已经是定义为http/1.1
但是经过压缩的文件仍旧是miss

三.
接着我们测试squid 3.0
而3.0并不支持http_port后面的http11参数
这让我们开始时有些怀疑是否也和2.x一样,无法对gizp内容进行cache
但是测试结果让我们惊喜
3.0对gzip内容可以完美的支持,而不需要添加任何其他控制参数
即便客户端使用的http/1.0协议
也可以对gzip压缩的内容进行正常缓冲
虽然我们以前的评测结果显示
squid 3.0并不适用于生产环境的实施
但是它却让我们看到一丝曙光
在squid 3.0足够完善之后
将是一款比squid 2.x更好更完善的产品.

四.
最后我们准备测试一下新的varnish
varnish应该是原生支持http/1.1的
经过测试.varnish对于deflate压缩过的文件
确实可以缓冲到
凭借着点.varnish有了足够挑战squid 2.x的资本

五.
最终我们的结论是
对于gzip压缩的内容
直到目前为止,squid 2.6 STABLE 20以及squid 2.7 STABLE 3无法进行有效缓冲
squid 3.0 STABLE 7以及varnish 1.1.2可以有效支持压缩后的http对象内容.

阅读内文 Tags: , , ,

SQUID基本理论及优化研究

6月 26th, 2008 | No Comments | Posted in Squid < by Johnny Woo >

资料来源,不断更新中
http://blog.s135.com/book/squid/

1.每G的磁盘缓冲.约使用32M的内存,具体大小决定于系统体系结构以及object大小.

2.squid使用临时端口对每个连入链接进行服务,所以当服务器负载比较大时,需要对端口数进行优化

echo "1024 40000" > /proc/sys/net/ipv4/ip_local_port_range

3.日志文件路径.
日志分为cache.log,记录squid状态和调试信息
access.log文,记录对squid发起的每个客户请求
store.log,记录进入和离开缓存的每个目标的记录

cache_log /squid/logs/cache.log
cache_access_log /squid/logs/access.log
cache_store_log /squid/logs/store.log

当需要极端性能的时候,可以将日志记录取消

cache_log /dev/null
cache_access_log /squid/logs/access.log
cache_store_log none

4.visible_hostname
我们知道没有指定可见主机名,squid将无法启动
其原因是squid在提供服务时,会把主机头插入http via以及x-cache头部
提供用户更详细的信息.而且将会把主机名使用在检测转发环路中

5.日志滚动

squid -k rotate

6.no_cache
此项用于指定内容是否会被squid缓存.由于此项使用no.在语意上会造成一定的混淆
no_cache allow 是允许指定内容进行缓冲
no_cache deny 是让指定目标不被缓存

7.L1以及L2缓冲
squid存储方式ufs,aufs,和diskd中,会使用L1,L2级目录
L1和L2参数指定了第一级和第二级目录的数量,默认的是16和256
如果针对特定的缓冲对象数量进行服务
则可以通过L1,L2参数的调整,使得每个L2目录下的文件数量保持在一个合理值之内

8.maximum_object_size
如果对象包含Content-Length头部
则SQUID在直接比较两个值之后做出缓冲与否的判断
否则将会在将对象存放在本地磁盘之后再对比文件大小

9.cache_dir写入选择算法
Squid有2个cache_dir选择算法。默认的算法叫做lease-load;替代的算法是round-robin。
least- load算法,就如其名字的意义一样,它选择当前工作负载最小的cache目录。负载概念依赖于存储机制。对aufs,coss和diskd机制来说,负载与挂起操作的数量有关。对ufs来说,负载是不变的。在cache_dir负载相等的情况下,该算法使用自由空间和最大目标大小作为附加选择条件。
round-robin算法也使用负载作为衡量标准。它选择某个负载小于100%的cache目录,当然,该目录里的存储目标没有超出大小限制,并且不是只读的。

10.删除缓存对象

squidclient -r http://www.lrrr.org/junk >/tmp/foo

11.删除个别对象

squidclient -m PURGE http://www.lrrr.org/junk

12.删除一组对象

awk '{print $7}' /usr/local/squid/var/logs/access.log \
        |
grep www.example.com \
        |
xargs -n 1 squidclient -m PURGE

13.删除全部对象
首先必须确认squid没有在运行

echo '' > /usr/local/squid/var/cache/swap.state

14.refresh_pattern
refresh_pattern规则仅仅应用到没有明确过时期限的响应。原始服务器能使用Expires头部,或者Cache-Control:max-age指令来指定过时期限。

refresh_pattern -i \.htm$ 0 20% 1440

15.文件系统优化
设置noatime
设置async

16.squid堆叠
通常把一组互相转发请求的cache(或代理)叫做cache堆叠。把cache堆叠的成员叫做邻居或对等伙伴
邻居cache有2种关系:父子或兄弟。从拓扑上看,父cache在堆叠里位于顶层,而兄弟cache位于同一层。两者真正的不同在于,父cache能为子cache转发cache丢失,然而兄弟cache之间不允许转发cache丢失。

17.HTCP与ICP
使用HTCP相对于ICP的主要优势在于更少的假命中。HTCP有更少的假命中,因为查询消息包含了完整的HTTP请求头部,包含了来自客户端的任何 Cache-Control要求。使用HTCP的主要不足在于HTCP查询更大,要求更多的CPU来处理产生和解析消息。测量显示,HTCP查询大约是 ICP查询的6倍大,这归咎于HTTP请求头部的存在。然而,squid的HTCP响应典型的比ICP响应小。

18.cache_peer_domain中域名的差异
如果是.test.com
则匹配test.com以及所有*.test.com
如果是test.com
则只匹配test.com

19.squid缓冲deflate压缩内容
squid 2.6之后对http/1.1的支持增强.支持ETAG以及Vary.
这样就能够对deflate压缩后的文件进行缓冲
cache_vary on

阅读内文 Tags: , ,

IT流言终结者1续篇:varnish vs squid

6月 11th, 2008 | 1 Comment | Posted in Squid, Varnish < by Johnny Woo >

update:
2008-06-11 squid 2.7由于网络关系在上次测试中表现不理想,后来在每次测试后均重启服务器和交换机.得出的结果更加准确一点

这次测试使用http_load的fetches参数进行
测试环境与上次相同
首先是varnish 1.1.2的测试结果

[root@test3 http_load-12mar2006]# ./http_load -parallel 200 -fetches 1000 urls
1000 fetches, 200 max parallel, 2.23782e+08 bytes, in 28.9272 seconds
223782 mean bytes/connection
34.5695 fetches/sec, 7.73603e+06 bytes/sec
msecs/connect: 293.744 mean, 20995.7 max, 0.23 min
msecs/first-response: 116.243 mean, 1237.96 max, 0.717 min
HTTP response codes:
 
code 200 -- 1000
[root@test3 http_load-12mar2006]# ./http_load -parallel 200 -fetches 1000 urls
1000 fetches, 200 max parallel, 2.23782e+08 bytes, in 28.6097 seconds
223782 mean bytes/connection
34.9532 fetches/sec, 7.8219e+06 bytes/sec
msecs/connect: 233.996 mean, 20995.2 max, 0.145 min
msecs/first-response: 126.736 mean, 904.133 max, 0.722 min
HTTP response codes:
 
code 200 -- 1000
[root@test3 http_load-12mar2006]# ./http_load -parallel 200 -fetches 1000 urls
1000 fetches, 200 max parallel, 2.23782e+08 bytes, in 26.1125 seconds
223782 mean bytes/connection
38.2959 fetches/sec, 8.56993e+06 bytes/sec
msecs/connect: 201.495 mean, 20994.7 max, 0.132 min
msecs/first-response: 163.002 mean, 2020.39 max, 0.727 min
HTTP response codes:
 
code 200 -- 1000

varnish的表现一直很稳定
也没有出错
虽然服务数比squid 2.6要少
但是毕竟还是保持在一定水平

接下来是squid 2.6的测试结果

[root@test3 http_load-12mar2006]# ./http_load -parallel 200 -fetches 1000 urls
1000 fetches, 200 max parallel, 2.23782e+08 bytes, in 23.5692 seconds
223782 mean bytes/connection
42.4282 fetches/sec, 9.49467e+06 bytes/sec
msecs/connect: 715.485 mean, 21006 max, 0.184 min
msecs/first-response: 97.5936 mean, 891.699 max, 0.986 min
HTTP response codes:
 
code 200 -- 1000
[root@test3 http_load-12mar2006]# ./http_load -parallel 200 -fetches 1000 urls
1000 fetches, 200 max parallel, 2.23782e+08 bytes, in 21.9795 seconds
223782 mean bytes/connection
45.497 fetches/sec, 1.01814e+07 bytes/sec
msecs/connect: 377.884 mean, 20995.4 max, 0.228 min
msecs/first-response: 116.212 mean, 3596.57 max, 0.977 min
HTTP response codes:
 
code 200 -- 1000
[root@test3 http_load-12mar2006]# ./http_load -parallel 200 -fetches 1000 urls
1000 fetches, 200 max parallel, 2.23782e+08 bytes, in 22.6211 seconds
223782 mean bytes/connection
44.2065 fetches/sec, 9.89261e+06 bytes/sec
msecs/connect: 653.928 mean, 20995.9 max, 0.199 min
msecs/first-response: 107.634 mean, 1597.88 max, 0.988 min
HTTP response codes:
 
code 200 -- 1000

squid 2.6的表现令人非常满意
高服务数以及稳定的服务结果

squid 2.7

[root@test3 http_load-12mar2006]# ./http_load -parallel 200 -fetches 1000 urls
1000 fetches, 200 max parallel, 2.23782e+08 bytes, in 23.8515 seconds
223782 mean bytes/connection
41.9261 fetches/sec, 9.38231e+06 bytes/sec
msecs/connect: 583.364 mean, 21000.4 max, 0.211 min
msecs/first-response: 94.2072 mean, 1280.54 max, 0.715 min
HTTP response codes:
 
code 200 -- 1000
[root@test3 http_load-12mar2006]# ./http_load -parallel 200 -fetches 1000 urls
1000 fetches, 200 max parallel, 2.23782e+08 bytes, in 24.2255 seconds
223782 mean bytes/connection
41.2788 fetches/sec, 9.23745e+06 bytes/sec
msecs/connect: 224.308 mean, 9031.01 max, 0.201 min
msecs/first-response: 123.128 mean, 4906.25 max, 0.725 min
HTTP response codes:
 
code 200 -- 1000
[root@test3 http_load-12mar2006]# ./http_load -parallel 200 -fetches 1000 urls
1000 fetches, 200 max parallel, 2.23782e+08 bytes, in 23.9704 seconds
223782 mean bytes/connection
41.7182 fetches/sec, 9.33578e+06 bytes/sec
msecs/connect: 235.831 mean, 20994.9 max, 0.162 min
msecs/first-response: 213.081 mean, 14413.7 max, 0.494 min
HTTP response codes:
 
code 200 -- 1000

由于上次测试网络设备和服务器本身测试过久的关系
导致错误率很高.
重新测试后
2.7的表现比较稳定
虽然服务能力不及2.6
但是在内存占用率以及CPU占用率方面有着相当优势

squid 3.0

[root@test3 http_load-12mar2006]# ./http_load -parallel 200 -fetches 1000 urls
1000 fetches, 200 max parallel, 2.23782e+08 bytes, in 24.5945 seconds
223782 mean bytes/connection
40.6594 fetches/sec, 9.09885e+06 bytes/sec
msecs/connect: 300.582 mean, 20994.9 max, 0.164 min
msecs/first-response: 76.3194 mean, 874.92 max, 0.975 min
HTTP response codes:
 
code 200 -- 1000
[root@test3 http_load-12mar2006]# ./http_load -parallel 200 -fetches 1000 urls
1000 fetches, 200 max parallel, 2.23782e+08 bytes, in 27.2884 seconds
223782 mean bytes/connection
36.6456 fetches/sec, 8.20062e+06 bytes/sec
msecs/connect: 236.186 mean, 20995.2 max, 0.188 min
msecs/first-response: 129.001 mean, 3201.61 max, 0.992 min
HTTP response codes:
 
code 200 -- 1000
[root@test3 http_load-12mar2006]# ./http_load -parallel 200 -fetches 1000 urls
1000 fetches, 200 max parallel, 2.23782e+08 bytes, in 21.9625 seconds
223782 mean bytes/connection
45.5321 fetches/sec, 1.01893e+07 bytes/sec
msecs/connect: 281.044 mean, 9032.06 max, 0.156 min
msecs/first-response: 131.911 mean, 15306.7 max, 0.982 min
HTTP response codes:
 
code 200 -- 1000

squid 3.0的表现出乎我意料
原本以为会比suqid 2.7更不稳定
结果在不停的测试了10次之后
依然没有和2.7那样出错
只是其性能表现不是很稳定
最高峰到达49f/s,而最低在31f/s

在特定访问数的情况下
squid 2.6比varnish 1.1.2性能更好
参照上次测试结果可以得出
在服务器的刚开始时(前10秒内)varnish的反应速度比squid要快
之后速度下降,最终保持一个稳定值

结论:
1.squid 2.6性能比varnish 要好.

阅读内文

IT流言终结者1:Varnish vs Squid

6月 10th, 2008 | 6 Comments | Posted in Squid, Varnish < by Johnny Woo >

UPDATE:
2008-06-11 加入了squid 2.7的测试

对于坊间流传的:
1.varnish的性能比squid高10~20倍
2.squid 3.0的性能比2.6有提高
本次测试将会揭示结果,
是否varnish的架构真的能提升那么多的性能
是否squid的新版本在性能上有所提升
测试中将不对平台.软件.等等进行优化
由于优化水平的关系将极大的影响结果.
此次测试中的数据可以作为基准数据.
可以由其中个别软件的优化与非优化结果比例系数
自行计算得出比较结果.所以个别软件的优化或者系统优化后对整体的影响
可以由读者自行对特定软件进行,并使用此基准数据进行推算.
WEB站点的页面
我将淘宝的首页获取到本地
作为测试对象
测试页面下载
index_files

平台:
PROXY:
CentOS 5.1 最小化安装
浪潮NF190
Xeon 2.8
1G RAM
73G SCSI
Squid 2.6,Squid 3.0,Varnish 1.1.2

WEB:
CentOS 5.1 最小化安装
浪潮NF180
Xeon 2.8
1G RAM
73G SCSI
Nginx 0.6.31

CLIENT:
CentOS 5.1 最小化安装
浪潮NF260
Xeon 2.4
512M RAM
36G SCSI
http_load-12mar2006

SWITCH:
DLINK DES 1024R+

1.Squid 2.6
编译参数

./configure --prefix=/usr/local/squid26

配置文件

visible_hostname test2.hiadmin.com
http_port 80 accel vhost vport
cache_peer 192.168.210.111 parent 80 0 no-query originserver name=test1
acl all src 0.0.0.0/0.0.0.0
http_access allow all
cache_log /var/log/squid26/cache.log

2.Squid 3.0
编译参数

./configure --prefix=/usr/local/squid30

配置文件

visible_hostname test2.hiadmin.com
http_port 80 accel vhost vport
cache_peer 192.168.210.111 parent 80 0 no-query originserver name=test1
acl all src 0.0.0.0/0.0.0.0
http_access allow all
cache_log /var/log/squid30/cache.log

3.Varnish 1.1.2
编译参数

./configure --prefix=/usr/local/varnish

配置文件

backend default {
        
set backend.host = "192.168.210.111";
        
set backend.port = "80";
}

运行参数

varnishd  -f /usr/local/varnish/default.vcl -a 0.0.0.0:80

4.Nginx 0.6.31
编译参数

./configure --prefix=/usr/local/nginx

配置文件

worker_processes  10;
events {
    
worker_connections  1024;
}
http {
    
include       mime.types;
    
default_type  application/octet-stream;
    
sendfile        on;
    
keepalive_timeout  65;
    
server {
        
listen       80;
        
server_name  localhost;
        
location / {
            
root   html;
            
index  index.html index.htm;
        
}
        
error_page   500 502 503 504  /50x.html;
        
location = /50x.html {
            
root   html;
        
}
    
}
}

5.http_load
运行参数

./http_load -parallel 1000 -seconds 10 urls.txt
urls.txt
http://192.168.210.222/index.html

6.squid 2.7
编译参数

./configure --prefix=/usr/local/squid27

配置文件

visible_hostname test2.hiadmin.com
http_port 80 accel vhost vport
cache_peer 192.168.210.111 parent 80 0 no-query originserver name=test1
acl all src 0.0.0.0/0.0.0.0
http_access allow all
cache_log /var/log/squid27/cache.log

测试结果

点图放大
图标中标注浅黄色的为客户端在抓取过程中只出现一次或几次的500
橙色的为出现500抓取错误的频率较多
红色的为几乎每次都会出现500抓取错误
值得注意的是squid 3.0
在500并发连接数时500出现的次数很多
但是在1000的时候反而抓取失败率下降了.

CPU和内存占用率

点图放大
varnish一直保持良好的CPU和内存使用率
但是到了1000并发数的时候
你会发现CPU使用率到了103%
没错.我并没有打错.在5次测试中,VARNISH的1000并发数测试其CPU占用率一直徘徊在101~103之间
可能是varnish的连接池写的不是特别好.当大于varnish处理量时,会使用更多的CPU资源去处理
squid 3.0似乎是个CPU和内存的占用大户
可能和版本比较新以及特性比较多有关(虽然这次什么特性都没用上)
squid 2.6保持了良好的姿态,稳定的CPU占用率和内存占用率.表明了为何市面上使用最多是它的原因.

更详细的内容可以下载此表格
varnish-vs-squid3

虽然varnish有着令人吃惊的CPU占用率(超过处理能力时也很令人吃惊)
但是其处理超大量的链接时内存和CPU使用率的暴涨并不令人满意
不过其表现出的在最大负荷时的fetchs/second
确实比squid 2.6要高出大约8%
实验表明.在需要更加稳定的生产环境中,varnish还不能替代老一代的squid 2.6
但是其对squid 3.0已经产生了很明显的挑战.
如果squid 3.0不能比他的上代产品提供更好的性能和稳定性的话
很有可能最佳反向代理的宝座会被varnish夺走
不论如何
这次测试的主题.varnish比squid有着10倍或者20倍的性能
被证实是不可能实现的.
虽然测试数据量充满100M带宽可能影响到测试的准确度.
但是更高的带宽所带来的同时连接数,很可能会撑爆varnish主机的CPU和内存.

结论
1.varnish在高负载下以CPU和内存为代价,比squid 2.6提高8%,但是绝非10倍~20倍.
2.squid 3.0的性能比2.6更低.而非更高.相反,3.0是最不稳定以及性能最差的.
3.squid 2.7的性能比2.6低,但是CPU和内存占用率控制的更好.

阅读内文

Squid 3.0 反向代理(加速模式)配置

6月 6th, 2008 | 1 Comment | Posted in Squid < by Johnny Woo >
visible_hostname squid1.ihompy.com
#设定squid的主机名,如无此项squid将无法启动
http_port 80 accel vhost vport
#设定squid为accel加速模式,vhost必须要加.否则将无法将主机头转发至后端服务器,访问时就会出现无法找到主机头的错误
cache_peer www.contentchina.com parent 80 0 no-query originserver name=contentchina
cache_peer bbs.contentchina.com parent 80 0 no-query originserver name=bbs
cache_peer www.ihompy.com parent 80 0 no-query originserver name