| Subcribe via RSS

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: , ,