Squid-2.6(sibling模式)

字体大小: 中小 标准 ->行高大小: 标准
一般 Squid Server 运作的模式是:
1. 当 Squid Server 没有资料时,会先向 Sibling 的 Squid Server 要资料,如果Sibling 没资料,就跳过它直接向 Parent 要。
2. 向 Parent 要资料,然後一直等,直到 Parent 给它资料为止(Parent 自己有的资料或上internet 去拿)。
3. 没有 Parent 时,就自己上 internet 去拿。
4. 如果这三者都拿不到资料,才向用户端回报拿不到资料。

原始WEB服务器,192.168.9.81,端口80
squid1,192.168.10.21,端口3128,ICP端口3130
squid2,192.168.10.22,端口3128,ICP端口3130
squid2,192.168.10.23,端口3128,ICP端口3130

21上的配置:
icp_port 3130
icp_access allow all
acl jobsdomain dstdomain jobs.test.com company.test.com
cache_peer 192.168.9.81 parent 80 0 no-query originserver no-digest name=www
cache_peer 192.168.10.22 sibling 80 3130 proxy-only
cache_peer 192.168.10.23 sibling 80 3130
proxy-only
cache_peer_domain www company.test.com
cache_peer_domain www jobs.test.com

always_direct allow !jobsdomain

always_direct 会导致所有请求都直接发送到原始服务器。而不会去查询sibling,对于jobs和comapny这两个域名不需要直接出去,而是要询问sibling。其余的域名,squid依然通过hosts去进行转发
proxy-only 当本地没有缓存时,回去sibling上找,并返回给客户。但是本地并不缓存sibling返回的文件。

22上的配置:
icp_port 3130
icp_access allow all
acl jobsdomain dstdomain jobs.test.com company.test.com
cache_peer 192.168.9.81 parent 80 0 no-query originserver no-digest name=www
cache_peer 192.168.10.21 sibling 80 3130
proxy-only
cache_peer 192.168.10.23 sibling 80 3130
proxy-only
cache_peer_domain www company.test.com
cache_peer_domain www jobs.test.com

always_direct allow !jobsdomain

23上的配置:
icp_port 3130
icp_access allow all
acl jobsdomain dstdomain jobs.test.com company.test.com
cache_peer 192.168.9.81 parent 80 0 no-query originserver no-digest name=www
cache_peer 192.168.10.22 sibling 80 3130
proxy-only
cache_peer 192.168.10.21 sibling 80 3130 proxy-only
cache_peer_domain www company.test.com
cache_peer_domain www jobs.test.com

always_direct allow !jobsdomain



测试:
一.22去访问 http://company.test.com/P6/CC1387/6575/CC138765751_Type_1.js,直到自己HIT住
因为这个资源是第一次去请求,之前在21和23上也没有cache。所以21和23返回ICP都是UDP_MISS:NONE,这时22的日志为:
192.168.9.99 - - [21/Sep/2009:19:31:12 +0800] "GET http://company.test.com/P10/CC0005/9109/CC000591099_Content_1.js HTTP/1.0" 200 1892 "http://jobs.test.com/P10/CC000591099J90250006000.htm" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" TCP_MISS:FIRST_UP_PARENT

二.21再次访问同样资源,这时,
22的日志:
192.168.10.21 - - [21/Sep/2009:09:15:25 +0800] "ICP_QUERY http://company.test.com/P6/CC1387/6575/CC138765751_Type_1.js HTTP/0.0" 0 84 "-" "-" UDP_HIT:NONE
说明22告诉了21,我这里已经有cache了。

21的日志:
192.168.9.98 - - [21/Sep/2009:09:15:25 +0800] "GEThttp://company.test.com/P6/CC1387/6575/CC138765751_Type_1.jsHTTP/1.0" 304 454 "http://jobs.test.com/P6.htm" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)" TCP_MISS:SIBLING_HIT (从sibling中获取了cache,而没有联系parent)

三.同样三台,对于不在jobsdomain定义中的域名:
192.168.10.114 - - [12/Mar/2010:16:25:12 +0800] "GET http://rd2.test.com/loginmgr/choose.asp HTTP/1.1" 302 694 "http://hr.test.com/index.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" TCP_MISS:DIRECT
Squid直接转发请求到原始服务器,并没有去匹配sibling规则

当本身的cache中没有资源时,squid会去sibling找资源的
cache_peer_domain:主要是控制针对不同域名的访问请求导向至各自的代理服务器或原始内容服务器,可以按来源分流。
个人感觉写了也没关系,但是实际发现会出现转发循环。不知是否和此设置有关。
转发循环的日志:WARNING: Forwarding loop detected for:
--disable-internal-dns,目的是关闭内部DNS.否则内部DNS不理睬你在etc/hosts中的设定,直接寻找域名服务器,这样就会造成转发循环。就是cache发送给物理服务器的更新请求(因为用域名)也会被用户的GSLN设备解析回来而形成循环。)(事实上这个参数我已经编译进去了)

cache_peer_access:类似 cache_peer_domain,但是使用访问列表控制对代理服务器的访问。
以上的实例,由于不需要针对访问请求选择代理服务器,也不需要进行控制,所以都没写。

另一个例子:用到cache_peer_domian进行域名分流,并有cache_peer_access进行访问控制
web服务器: 192.168.3.1 192.168.3.2
squid服务器:192.168.1.1 192.168.1.2

acl A src 192.168.1.1/32
acl B src 192.168.1.2/32
cache_peer 192.168.3.1 parent 80 0 no-query no-digest originserver name=www1 sourcehash
cache_peer 192.168.3.2 parent 80 0 no-query no-digest originserver name=www2 sourcehash

cache_peer_domain www1 abc.com
cache_peer_domain www2 abc.com 以上两个是说访问abc.com的,parent为www1和www2

cache_peer_access www1 allow A 只允许A使用上层代理www1
cache_peer_access www2 allow B 只允许B使用上层代理www2

以上两个达到的效果是,通过Asquid访问abc.com,实际访问的是www1。通过Bsquid访问abc.com,实际访问的是www2。这样的目的就是按访问来源分到指定机器去。



Cache_peer的使用格式如下:

cache_peer hostname type http_port icp_port

共有5个选项可以配置:

1. hostname:指被请求的同级子代理服务器或父代理服务器。可以用主机名或ip地址表示;

2. type:指明hostname的类型,是同级子代理服务器还是父代理服务器

3. http_porthostname的监听端口;

4. icp_porthostname上的ICP监听端口,对于不支持ICP协议的可指定7

5. options:可以包含一个或多个关键字。

Options可能的关键字有:

1 proxy-only:指明从peer得到的数据在本地不进行缓存,缺省地,squid是要缓存这部分数据的;

2 weight=n:用于你有多个peer的情况,这时如果多于一个以上的peer拥有你请求的数据时,squid通过计算每个peerICP响应时间来 决定其weight的值,然后squid向其中拥有最大weightpeer发出ICP请求。也即weight值越大,其优先级越高。当然你也可以手工 指定其weight值;

3 no-query 不发送icp信息包到此机器,一般设置原始主机用(如果是cache机,则需要互相发送icp包验证存在性)

4 Default:有点象路由表中的缺省路由,该peer将被用作最后的尝试手段。当你只有一个父代理服务器并且其不支持ICP协议时,可以使用default

5login=user:password:当你的父代理服务器要求用户认证时可以使用该选项来进行认证
6.
originserver:指明是源服务器
7. no-digest:用于cache_peer指令,不下载邻居的cache摘要

首先,必须在编译squid时激活Cache Digest代码。在运行./configure时简单的增加--enable-cache-digests选项。采用这步导致在运行squid时发生2件事:

1)Squid cache产生它自己内容的摘要。邻居cache如果也配置了使用cache摘要,那可能就会请求这个摘要。2)Squid请求每个邻居的cache摘要。

假如不想请求某个邻居的cache摘要,就在cache_peer行里使用no-digest选项,例如:

cache_peer neighbor.host.name parent 3128 3130 no-digest
其他配置:
1.hierarchy_stoplist
它包含一个字符串列表,当在URI里发现它们时,squid将请求标记为不可层叠,squid直接发送不可层叠的请求到原始服务器。
例如:hierarchy_stoplist ?cgi-bin
2.prefer_direct on 先发送请求到原始服务器,连不上再发送到邻居cache,默认of


附上一遍相关资料:利用 squid 反向代理提高网站性能
http://www.ibm.com/developerworks/cn/linux/l-cn-squid/

此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/69550.html