Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10197739
  • 博文数量: 1669
  • 博客积分: 16831
  • 博客等级: 上将
  • 技术积分: 12594
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-25 07:23
个人简介

柔中带刚,刚中带柔,淫荡中富含柔和,刚猛中荡漾风骚,无坚不摧,无孔不入!

文章分类

全部博文(1669)

文章存档

2023年(4)

2022年(1)

2021年(10)

2020年(24)

2019年(4)

2018年(19)

2017年(66)

2016年(60)

2015年(49)

2014年(201)

2013年(221)

2012年(638)

2011年(372)

分类: 网络与安全

2013-03-13 09:46:38

读squid权威指南笔记:squid集群(sibling模式)  

2011-05-09 15:24:46|  分类: mem_squid_porxy |  标签:squid  cache  icp  服务器  邻居   |字号 

认真读了几次squid权威指南,其中的就是指的squid集群(sibling模式)的工作.

做了一些小的总结.

配置成sibling时的工作原理.

默认的,squid首先发送大多数的请求到邻居cache,然后再到原始服务器。当ICP查询进来时,squid通过检查内存索引,能告知它是否有更新的、缓存的响应。squid会计算URI的MD5 hash值,并且在索引里查找它。假如没有找到,squid返回ICP_MISS消息。假如找到了,squid检查超时时间。假如目标没有刷新,squid返回ICP_MISS。对刷新的目标,squid返回ICP_HIT。

cache选择的顺序
选择新鲜cache目标的优先级是:
local cache
parent
sibling
direct


对ICP的理解

因为ICP会更加快,所以这选择ICP.
ICP是轻量级的目标定位协议,它作为Harvest项目的一部分而被发明。ICP客户发送查询消息到一个或多个ICP服务器,询问它们是否缓存了某个 URI(ICP查询仅包含URI,没有另外的请求头部。这让它很难精确的指示cache命中)。每个服务器响应一个ICP_HIT(ICP命中),ICP_MISS(ICP丢失),或其他类型的ICP消息。ICP客户使用ICP响应里的信息来做转发决定。
ICP也得承受某些设计不足带来的责难:安全性,伸缩性,假命中,和请求方式的缺乏。该协议不包括任何安全机制。通常squid不能确认某个ICP消息是可信的;它依赖于基于地址的访问控制来过滤掉不想要的ICP消息。
ICP的伸缩性也很差。ICP消息的数量(和带宽)增长,与邻居cache的数量成正比。除非使用某种隔离机制,这实际上限制了你能使用的邻居cache的数量。我不推荐拥有超过5或6个邻居cache。
netdb主要用于ICP查询.netdb是设计来测量到原始服务器的远近

有用的命令
log_icp_queries on #是否记录指令来阻止记录icp的日志从这些查询
icp_hit_stale on
注意.它是告诉squid对任何cache住的目标,即使它是陈旧的,都返回ICP_HIT。这在父子关系的cache中很安全,但对姐妹关系的cache有问题。假如必须转发所有的假命中,激活icp_hit_stale就会给姐妹关系cache带来麻烦。这时ICP客户端cache_peer的allow-miss选项就变得有用。当设置了allow-miss选项时,squid忽略它发送到姐妹cache的HTTP请求里的only-if- cached指令。
假如激活了icp_hit_stale,必须确保miss_access不会拒绝来自姐妹cache的cache(源squid)丢失请求。

Cache摘要(Cache Digest)
Cache摘要基于由Pei Cao首先发布的一项技术,叫做摘要缓存。基本思路是用一个Bloom filter来表现cache内容。邻居cache下载其他每个cache的Bloom filter(也即摘要)。然后,通过查询摘要来决定某个URI是否在邻居的cache里。

相对于ICP,cache摘要以空间交换时间。ICP查询浪费时间(延时),cache摘要浪费空间(内存,磁盘)。在squid中,邻居的摘要完全存放在内存里。在一个典型的摘要里,每百万目标需要大约625KB的内存。

digest_generation on #开启.本参数指令控制squid是否产生自己的cache摘要

squid堆叠会有三个问题要注意
1.经历错误的http头,如服务不可达的中squid中的html错误.
2.假命中.
3.转发循环

转发循环的控制方法有
1.使用cache_peer_access指令来阻止这类循环。例如,假如邻居cache的IP地址是192.168.1.1,下面的行让squid不会产生转发循环:

acl FromNeighbor src 192.168.1.1
           
cache_peer_access the.neighbor.name deny FromNeighbor

2.转发循环在HTTP拦截里也能发生,特别是当拦截设备位于squid和原始服务器之间的路径上时。

Squid 通过检查Via头部里的主机名,来检测转发循环。假如2个协作cache有相同的主机名,实际上就会得到假转发循环。在该情形下,unique_hostname指令很有用。注意,假如Via头部被过滤掉了(例如使用headers_access指令),squid就不能检测到转发循环。
 

下面转一个别人对这个的笔记

1) cache_peer邻居分为parent(父邻居),sibling(子邻居).parent和sibling的区别在于父邻居能为子cache转发丢失的Cache,而子邻居不可能.(是可以的,但要设置miss_access)

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设置父邻居的权重来给予他更高的优先级)

ICP/HCTP和Cache摘要以及CARP一样,都是判断请求的URI是否在邻居中被命中。ICP是发送URL请求,Squid等待着邻居的回应,网络的延迟也是很大的,而且在姐妹Cache中假命中又显得很突出。No-Query,禁用ICP协议! Cache摘要是在邻居中生成摘要信息,摘要往往把反应在Cache中的信息,邻居下载每个Cache中的摘要,发送URI请求时查看URL是否在某个摘要中。


服务器迁移---squid反向代理

前言:
       公司服务器需要进行迁移,从A机柜到B机柜,二机柜之间的距离为10米。哈哈。好近,尽管很近,但IP段不一样。
因此web,dns,mail,mysql 都得切换~
在这里呢,先写一些切换前的准备工作,squid 反向代理就是其中之一
特别感谢IORI,明的指点!!!感谢党,感谢人民,感谢51CTO,感谢你们~
 
一.反向代理的概念 
 
  什么是反向代理呢?其实,反向代理也就是通常所说的WEB服务器加速,它是一种通过在繁忙的WEB服务器和Internet之间增加一个高速的
WEB缓冲服务器(即:WEB反向代理服务器)来降低实际的WEB服务器的负载。典型的结构如下图所示:
   读squid权威指南笔记:squid集群(sibling模式) - zhuzhu - 五事九思
 
Web服务器加速(反向代理)是针对Web服务器提供加速功能的。它作为代理Cache,但并不针对浏览器用户,而针对一台或多台特定Web服务器
(这也是反向代理名称的由来)。实施反向代理(如上图所示),只要将Reverse Proxy Cache设备放置在一台或多台Web服务器前端即可。当
互联网用户访问某个WEB服务器时,通过DNS服务器解析后的IP地址是Reverse Proxy Server的IP地址,而非原始Web服务器的IP地址,这时
Reverse Proxy Server设备充当Web服务器,浏览器可以与它连接,无需再直接与Web服务器相连。因此,大量Web服务工作量被卸载到反向代理
服务上。不但能够防止外部网主机直接和web服务器直接通信带来的安全隐患,而且能够很大程度上减轻web服务器的负担,提高访问速度。
二.反向代理工作原理
 
  反向代理服务器位于本地WEB服务器和Internet之间,如下图所示:
读squid权威指南笔记:squid集群(sibling模式) - zhuzhu - 五事九思
 
  当用户浏览器发出一个HTTP请求时,通过域名解析将请求定向到反向代理服务器(如果要实现多个WEB服务器的反向代理,需要将多个WEB
服务器的域名都指向反向代理服务器)。由反向代理服务器处理器请求。反向代理一般只缓存可缓冲的数据(比如html网页和图片等),而一
些CGI脚本程序或者ASP之类的程序不缓存。它根据从WEB服务器返回的HTTP头标记来缓冲静态页面。
以上来自互联网
 
三.squid做反向代理
 
1.安装 
注:如果系统是redhat 9,需要安装epoll的库文件(epoll有效的降低系统的I/0瓶颈,资源占用率)
wget [url][/url]
为了安全起见,建立squid运行的用户及组 
useradd squid -M -c "Squid user" -d /dev/null -s /sbin/nologin 
tar zxvf squid-3.0.STABLE2.tar.gz 
cd squid-3.0.STABLE2 
./configure --prefix=/usr/local/squid3 --disable-carp --with-aufs-threads=32 --with-pthreads --enable-storeio='ufs,aufs,coss,null' --enable-disk-io='AIO,Blocking' --enable-removal-policies='heap,lru'  
--disable-wccp --enable-kill-parent-hack --disable-snmp --disable-poll --disable-select --enable-auth=basic --with-aio  
--disable-ident-lookup --with-filedescriptors=65536  
 
编译参数:
--prefix=/usr/local/squid3 :指定安装路径 为便于管理
--enable-poll :提升性能
--enable-snmp :此选项可以让MRTG使用SNMP协议对服务器的流量状态进行监测,因此必须选择此项,使Squid
支持SNMP接口。 
--enable-storeio=ufs,null #使用的文件系统通常是默认的ufs,不过如果想要做一个不缓存任何文件的代理
服务器,就需要加上null文件系统。 
其它的参数等待大家来解释。HOHO ~
make;make install
安装完毕。
 
2.配置
注意:squid 的配置文件在:/usr/local/squid3/etc/squid.conf
 这里是最重要的,也是最难的。
http_port 80   选项 http_port 指定squid监听HTTP请求的端口,一般都设置成80端口,这样使用户感觉不到反向代理的存在,就像访问真正 
的WEB服务器一样。

cache_mem 128 MB          共享内存大小(squid在提供服务的时候所使用的内存)

maximum_object_size_in_memory 512 KB   最大内存缓存OBJECT值~如果超过则不再内存中缓存~而存入IO中!

memory_replacement_policy lru      替换机制  (lru叫做 最近不常用的单元 unit一般就是常说的object 也就是当cache中的内容比如内存或硬盘达到上限时的 那么就需要进行数据的换进和换出工作) 
cache_dir null /tmp  cache_dir存储cache内容也就是object的物理存放点 

cache_dir ufs /tmp1 10000 16 256  (/tmp size L1 L2) 
100G其中1层目录16个 并且每个1层目录下又有256个2层目录[或者说子目录] 
#磁盘缓存的类型和目录,大小,一二级目录的设置,这里磁盘缓存大小是10G 
ufs是一种文件存储方式 因为os一般都是从内存获取数据 那么内存的东西必须最后写的硬盘上~ 
sync 同步的时候用的ufs 那么squid也是一样 
ufs一般是同时写入内存和硬盘 
注意:size是按照M为单位的也就这个目录中最大存储容量的上限 

max_open_disk_fds 0 

minimum_object_size 0 KB 

maximum_object_size 4096 KB 

logformat squid  %ts.%03tu %6tr %>a %Ss/%03Hs % 设置access_log中日志存储的格式~ 

access_log /usr/local/squid3/var/logs/access.log squid    
access_log为客户端请求的日志 

cache_log /usr/local/squid3/var/logs/cache.log    
为squid自身的运行日志 

pid_filename /usr/local/squid3/var/logs/squid.pid 
此三项是设置PID和日志文件位置 

cache_store_log none  不记录store.log 

visible_hostname liuyu.blog.51cto.com  
liuyu.blog.51cto.com    只是标签  有利于检查是否你的那台设备在提供服务! 

cache_peer 192.168.1.53       parent    80  0 no-query round-robin max-conn=32 originserver 
squid2.5以上都是用的cache_peer来指定所需要代理的服务器的IP 这一点很重要! 由于本例squid 与web  不在同一服务器,因此需要cache_peer 指定相应WEB服务器IP 

acl all src 0.0.0.0/0.0.0.0 

acl QUERY urlpath_regex cgi-bin .php .cgi .avi .wmv .rm .ram .mpg .mpeg .zip .exe 
cache deny QUERY 

cache_effective_user squid 
cache_effective_group squid 


在这里我所以的日志都记录在:/usr/local/squid3/var/logs里 
给目录相应的权限 
chmod 666 -R /usr/local/squid3/var/logs 
chown squid:squid -R /usr/local/squid3/var/logs 

 
保存配置!
 
3.测试配置是否正确
# /usr/local/squid2/sbin/squid -k parse
出现ERROR: 
WARNING: Cannot write log file: /usr/local/squid3/var/logs/cache.log 
/usr/local/squid3/var/logs/cache.log: Permission denied 
         messages will be sent to 'stderr'. 
2008/03/13 12:53:09| Creating Swap Directories 
FATAL: Failed to make swap directory /usr/local/squid3/var/cache: (13) Permission denied 

很明显权限不对,修改后测试通过!
 
/usr/local/squid2/sbin/squid -z 
   -z        Create swap directories 是创建SWAP目录的! 也就是cache_dir 中的目录
相关的调试命令:
 
4.启动squid 
  /usr/local/squid3/sbin/squid -Nd1
  ps aux |grep squid  查看是否启动
 
5.测试访问WEB站点
  本机hosts 文件指向squid代理服务器
出现ERROR: 
Access Denied. 
访问拒绝 
Access control configuration prevents your request from being allowed at this time. Please contact your service provider if  

you feel this is incorrect.  
当前的存取控制设定禁止您的请求被接受,如果您觉得这是错误的,请与您网路服务的提供者联系。  
本缓存服务器管理员:webmaster  

配置文件设置不对: 
acl  all  src 0.0.0.0/0.0.0.0 
http_access allow all
 
重新测试:OK 一切正常~~~
查看相应日志一切正常。
 
四. 配置squid 是方便web进行切换,至于dns,mysql,mail切换文章请大家期待~
   总体来说,squid 配置不是很麻烦,主要是配置文件里的每一项,对服务器的产生的影响非常的重要。细节决定成功~


阅读(1255) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~