狮子的雄心,骆驼的耐力,孩子的执著!
分类: 系统运维
2016-12-09 11:47:38
如果要设置父级的代理服务器,例如proxy.test.edu.cn那么可以这样配置
在#cache_peer hostname type 3128 3130 之下加入
cache_peer proxy.test.edu.cn parent 3128 3130 no-query no-netdb-exchange
如果要设置同级的代理服务器,如:192.168.1.41 192.168.1.42则可以这样来配置
cache_peer 192.168.1.41 sibling 3128 3130 proxy-only
....
注意目前各单位施行代理服务器分级管理,设置父级代理服务器,还必须取得上层单位的同意
说明:
(1)命令cache_peer的定义格式是:
cache_peer hostname type 3128 3130
hostname 是用来指定获取缓冲的PROXY主机的名字
type 是PROXY主机的类型,有以上PARENT SIBLING两种
3128:HTTP_PORT
3130:ICP_PORT
(2)附加配置选项(注意应为小写,配置时)
NO-QUERY:不做查询操作,直接获取数据
NO-NETDB-EXCHANGE:代理服务器之间不交互信息
NO-DIGEST:代理服务器之间不做摘要表查询,直接用ICP协议沟通(同级代理)
PROXY-ONLY:直接获取对方缓冲,转交给代理服务器的客户端,而不存入本地
ROUND-ROBIN:如果设置数部上层服务器,那么轮流查询父级服务器
LOGIN=USER:PASSWD:要求对方做帐号及密码验证,例如
cache_peer 192.168.1.41 sibling 3128 3130 login=kao:123456
举例:
以下为squid1机器上的配置
icp_port 3130
acl domian dst
acl squid2 src xx.xx.xx.xx
acl squid3 src xx.xx.xx.xx
http_access allow squid2
http_access allow squid3
1.配置 squid2、squid3 为其邻居,当 squid1 在其缓存中没有找到请求的资源时,通过 ICP 查询去其邻居中取得缓存
cache_peer squid2 sibling 80 3130
cache_peer squid3 sibling 80 3130
2.squid1的三个父节点,originserver 参数指明是源服务器,round-robin 参数指明 squid 通过轮询方式将请求分发到其中一台父节点;squid 同时会对这些父节点的健康状态进行检查,如果父节点down了,那么 squid 会从剩余的 origin 服务器中抓取数据。
cache_peer 192.168.1.1 parent 8080 0 no-query originserver round-robin name=www1
cache_peer 192.168.1.2 parent 8080 0 no-query originserver round-robin name=www2
cache_peer 192.168.1.3 parent 8080 0 no-query originserver round-robin name=www3
3.将 域的请求通过 RR 轮询方式转发到三个父节点中的一个。
cache_peer_domain www1 domian
cache_peer_domain www2 domian
cache_peer_domain www3 domian
4.always_direct会导致所有请求都直接发送到原始服务器。而不会去查询sibling,对于这个域名不需要直接出去,而是要询问sibling。其余的域名,squid依然通过hosts去进行转发
always_direct allow !domain
Cache_peer的理解
1) cache_peer邻居分为parent(父邻居),sibling(子邻居).parent和sibling的区别在于父邻居能为子cache转发丢失的Cache,而子邻居不可能.
2) cache_peer通过cache_peer_access和cache_peer_domain来控制邻居的访问.二者的区别在于前者一般需要先定义一个ACL而后者都直接匹配相应的域名就可以了.
如:
cache_peer 192.168.0.1 parent 3128 3130
acl AllowDomain dst
cache_peer_access AllowDomain 192.168.0.1
cache_peer_domain 192.168.0.1 parent .xyc.com
3) cache_peer通过never_direct,always_direct,hierarchy_stoplist等限制对邻居的访问.
4) squid与邻居cache的通信一般为先为never_direct,always_direct确定怎么样转发(根据相应的标识driect, never_direct标识为direct_no,always_direct标识为direct_yes即直接转发到原始服务器等等 direct_maybe详情见Squid中文权威指南10.10.1),接着Squid根据Squid的设置查看耕邻居的摘要是否命中(根据ICP或 HCTP的请求所发现的),若命中则立即放入转发列表中.这一切也依靠cache_peer_access,cache_peer_domain的.同时 squid检查netdb侦测的RTT是否最优,决定是否选择此邻居转发.
5)子邻居不转发任何命中丢失的请求,而父邻居可以转发,若Squid发现父邻居到原始服务器的RTT(往返时间)小于自已到原始服务器的RTT,将此请求转发给此父邻居.(RTT时间需借助Netdb选项的检测,对于父邻居的选择还有另外一些定义选项如:Weigh=N设置父邻居的权重来给予他更高的优先级)
昨天晚上明辉打电话过来,说访问错误,以前与遇到过,估计不是Squid问题,我很郁闷,正好那天,公司申请的无线上网卡没钱,只能打电话让韩飞看看,他边测试,我边给我说情况,起初确定问题不再Squid,因为出现的是403,而错误页面不是Squid生成的,只得让他赶紧从lvs中移除,等今天早上来公司解决! 早上来到公司立马检查,先查看 1:access_log 先查看日志,发现是403,而且缓存了403,PURGE还是403! 2:tcpdump 发现数据包没到指定cache_peer,但是别的域名能够正常访问! 3:squid -k debug 最后修改端口,开启debug 才找到问题 是因为定义了一个cache_peer,但是没有cache_peer_[domain|access] 引用,结果选择Parent的时候,成了FIRST_UP_PARENT,就导致发送错误IP,返回403,而别的域名能够访问是因为正好发送到的IP是源站! lvs的另外一台机器也正常,分析日志是TCP_MISS:CARP,CARP不了解,也算巧合把! 现在就将故障重现!
1:配置环境
172.16.1.1 C:\WINDOWS\system32\drivers\etc\HOSTS 172.16.1.54 172.16.1.54 xin.ming.com 172.16.1.54 abxin.ming.com 172.16.1.54 [root@54 etc]# grep "^cache_peer" /opt/app/squid3/etc/squid.conf cache_peer 172.16.1.55 parent 80 0 no-query no-digest originserver name=ming cache_peer 172.16.1.56 parent 80 0 no-query no-digest originserver name=ming_2 cache_peer_domain ming_2 cache_peer 172.16.1.57 parent 80 0 no-query no-digest originserver name=xin cache_peer_domain xin xin.ming.com [root@54 etc]# 172.16.1.55 和 172.16.1.56 nginx.conf server { listen 80; deny all; } server { listen 80; server_name ; location / { root html; index index.html index.htm; } } 172.16.1.57 nginx.conf server { listen 80; deny all; } server { listen 80; server_name xin.ming.com; location / { root html; index index.html index.htm; } } 2:测试 E:\>curl -I -X GET http:/// HTTP/1.0 200 OK E:\>curl -I -X GET HTTP/1.0 403 Forbidden 3:分析 抓包看到,不论是 还是 xin.ming.com 都匹配到了cache_peer 172.16.1.55 parent 80 0 no-query no-digest originserver name=ming 将cache_peer_domain 修改成cache_peer_access 形式 依旧如此 注释掉 cache_peer 172.16.1.55 parent 80 0 no-query no-digest originserver name=ming 再次测试,已经正确转发! E:\>curl -I -X GET http:/// HTTP/1.0 200 OK E:\>curl -I -X GET HTTP/1.0 200 OK 疑问: 没有使用cache_peer_access cache_peer_domain 引用,不会被匹配的把,就算匹配,也该是优先级最低啊,这样别人可以利用这点攻击,比如 E:\>curl -I -X GET # 不存在的域名,结果转发了返回403 HTTP/1.0 403 Forbidden # 试着将cache_peer 172.16.1.55 parent 80 0 no-query no-digest originserver name=ming 放在最后,上面 xin.ming.com 能够正常转发,abxin.ming.com 出现403,说明也是转发到1.55 了,也是没必要的,那就只能注释掉才行了! 试着用squid-2.7.STABLE9 测试,发现处理方式一样,看样子只能以后注意了,最可怕的是,知道还有哪些奇怪的方式,已经遇见几个了... 总结: 感觉Squid有些东西无法控制,有些东西还很混乱,比如cache_peer_domain cache_peer_access 同时使用,就很让人纠结,也许该抽空尝试下varnish了! |