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
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
cache_peer 192.168.10.23 sibling 80 3130
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
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
cache_peer 192.168.10.23 sibling 80 3130
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
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
cache_peer 192.168.10.21 sibling 80 3130
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
三.同样三台,对于不在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服务器:
squid服务器:192.168.1.1
acl
acl
cache_peer 192.168.3.1 parent 80
cache_peer 192.168.3.2 parent 80 0 no-query no-digest originserver
cache_peer_domain www1 abc.com
cache_peer_domain www2 abc.com
cache_peer_access www1 allow A
cache_peer_access www2 allow B
以上两个达到的效果是,通过Asquid访问abc.com,实际访问的是www1。通过Bsquid访问abc.com,实际访问的是www2。这样的目的就是按访问来源分到指定机器去。
Cache_peer的使用格式如下:
cache_peer
共有5个选项可以配置:
1. hostname:指被请求的同级子代理服务器或父代理服务器。可以用主机名或ip地址表示;
2. type:指明hostname的类型,是同级子代理服务器还是父代理服务器;
3. http_port:hostname的监听端口;
4. icp_port:hostname上的ICP监听端口,对于不支持ICP协议的可指定7;
5. options:可以包含一个或多个关键字。
Options可能的关键字有:
1. proxy-only:指明从peer得到的数据在本地不进行缓存,缺省地,squid是要缓存这部分数据的;
2. weight=n:用于你有多个peer的情况,这时如果多于一个以上的peer拥有你请求的数据时,squid通过计算每个peer的ICP响应时间来 决定其weight的值,然后squid向其中拥有最大weight的peer发出ICP请求。也即weight值越大,其优先级越高。当然你也可以手工 指定其weight值;
3. no-query: 不发送icp信息包到此机器,一般设置原始主机用(如果是cache机,则需要互相发送icp包验证存在性)
4. Default:有点象路由表中的缺省路由,该peer将被用作最后的尝试手段。当你只有一个父代理服务器并且其不支持ICP协议时,可以使用default和
5.login=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
例如:hierarchy_stoplist
2.prefer_direct
附上一遍相关资料:利用 squid 反向代理提高网站性能
http://www.ibm.com/developerworks/cn/linux/l-cn-squid/
此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/69550.html