分类: LINUX
2010-09-21 11:27:35
squid工作原理
一、SQUID缓存的存放方式:
是将缓存文件放入cache_dir 规定的目录中,采用了两级HASH路径。(Squid 把它叫object)。
1.1 磁盘工作方式
磁盘缓存的情况比较复杂, squid 有 ufs, aufs, coss, diskd, null 五种存储后端, 其中 ufs,aufs,diskd都是在文件系统上面保存很多小文件, coss 是 squid自己实现了一个简单的文件系统,可以使用一个大文件或者一个磁盘设备来存储. null 则是给不想要磁盘缓存的情况准备的. coss看起来好像比较拽, 但是以前试验并不足够稳定,因此并不推荐使用. 剩下的三种存储方式,具体选择哪种需要根据操作系统的特性来进行.
ufs 是最传统的存储方式, 我们知道, squid 是一个单进程的程序, 它使用 ufs 存储后端时, 直接在进程里面读写文件.这是一种很简单的方式, 缺点是当读写磁盘被阻塞的时候, squid 不能够处理请求, 会造成服务质量波动比较大. 因此出现了 aufs 和diskd 两种存储后端, 原理都是 squid 主服务循环不负责读写文件,而是通过消息队列或者tcp/pipe连接将数据传送给其他的线程(aufs)/进程(diskd), 然后其他线程/进程进行读写.很显然,这两种存储方式有一定的通信开销, 因此不一定就比 ufs 好, 需要具体问题具体分析。
对于一些老系统,使用 aufs 或者 diskd 是比较好的选择,如果系统的线程库比较好(如Linux,Solaris),那么使用aufs, 否则 diskd.也有一些例外情况, 比如多 cpu 的 Linux 2.6 系统, 线程库很优秀, 虽然 ufs 本身已经比较快了,但是 squid单进程无法利用另外的 cpu , 不如使用 aufs , 让另外的 cpu 也可以起到一些作用, aufs在编译的时候可以选择使用几个读写线程(--with-aufs-threads=N_THREADS). 这个个人觉得稍微超过 cpu 个数就可以了.但是并没有实际测试过.
1.2 内存工作原理
Squid启动之后,会在RAM建立一个Hash Table,记录硬盘中object配置的情形。
Squid又会在RAM中建立一个Digest Table(摘要表) ,其功能是和其他有合作关的Squid(Sibling)互相交换 Digest Table,万一用户端想要的资料自己没有时,可以很快的知道哪一部 Squid Server 有资料(Squid 也可以透过ICP向其他Squid查询,但速度较慢)。但是 Digest Table 本身不小,既记忆体又频宽,如果 Server 的内存不够,对外带宽不够,反而比ICP查询更慢。
二、SQUID的查询方式:
SQUID通过查询表的方式来定位某个资源的位置,所查询的表叫Hash table 和Digest table;Digest table在这里可以称之为摘要或者索引,它记录了磁盘上每个分区,每个目录里存的缓存摘要,Hash table在这里可以称之为目录或者提纲,它记录所有的Digest table表信息,SQUID接受到请求后先查询Hash table,在根据Hash table所指向的Digest table查询需要的信息。
三、SQUID服务器之间的关系:
SQUID服务器存在两种工作关系,一种为Child、Parent,当child squid server没有用户需要的数据时,就象parent server发出请求,并持续等待,直到parent server回应自己为止;另外一种为ibling,当本地SQUID server没有用户请求数据时,会向sibling server发出请求,如果sibling server没有资料则会向上级sibling或者INTERNET发送数据请求
四、SQUID运作模式
1. 当Squid Server 没有资料时,会先向Sibling 的Squid Server 要资料,如果Sibling没资料,就跳过它直接向Parent 要。
2. 向Parent 要资料,然後一直等,直到Parent 给它资料为止(Parent 自己有的资料或上Internet 去拿)。
3. 没有Parent 时,就自己上Internet 去拿。
4. 如果这三者都拿不到资料,才向用户端回报拿不到资料。
一般而言,把网路上一层的Squid Server 设成Sibling 是不错的选择(例如:一个学校将所在城市网和附近的大学设成Sibling),因为网路上一层的Squid Server 服务对象较多,其硬件功能较强,离我们比较近,速度也比较快;万一要不到资料,我们还可以自己上Internet 去拿。那什麽时候设Parent?当您的出口只有一个,或上一层Squid Server 拿不到资料,自己也一定拿不到,只好将上一层Squid Server 设为Parent。
五、配置文件
visible_hostname localhost
声明该虚拟机的主机名,没有这项,SQUID无法启动
http_port 191.169.0.231:80 accel vhost vport
定义服务监听端口,
accel是开启SQUID反向加速代理的选项
vhost vport也是反向代理的选项
http_port 211.144.140.147:80 transparent (正向代理)
cache_peer 192.168.3.6 parent 80 0 no-query originserver name=web2
定义父代理的位置,并为这个设置定义为web2
acl web2 dstdomain luwan.china.techcenter.test.cn
定义acl规定 luwan.china.techcenter.test.cn 这个域名的请求为web2
cache_peer_access web2 allow web2
定义缓存访问规则,允许ACL定义的WEB2访问父代理的WEB2(注:最右边的web2代表ACL定义的规则)
http_access allow web2
访问控制定义,只允许访问dstdomain luwan.china.techcenter.test.cn这个域名相关
cache_mem 50 MB
缓存所用到的内存大小,一般设为内存一半,但是不要超过2G
cache_swap_low 80
缓存空间允许使用的最小空间
cache_swap_high 95
缓存空间允许使用的最大空间
(最大和最小的工作方式是,当空间使用到95%的时候,存储的新的文件,不是直接存入磁盘,而是采取用新的文件代替旧的文件,这种工作方式一直持续到空间下降到80%的时候)
ipcache_size 10000
ipcache_low 90
ipcache_high 95
由DNS正反解所得到的IP存在缓存区的大小,这样可以加快解析速度.(正向代理中配置这个选项效果会好一点,反向代理无所谓)
acl QUERY urlpath_regex cgi-bin \?
acl forcecache url_regex -i b2b.mainone.com
no_cache allow forcecache
no_cache deny QUERY(凡是url带有cgi-bin ?的,都不缓存)
refresh_pattern -i b2b.mainone.com 1440 20% 10080 override-expire override-lastmod reload-into-ims ignore-reload ignore-no-cache ignore-private
强制缓存某域名的所有文件
refresh_pattern -i .jpg$ 1440 100% 10080 override-expire override-lastmod reload-into-ims ignore-reload ignore-no-cache ignore-private
设置强制更新
.jpg 类型
1440 代表最小的缓存时间
%100是缓存时间百分比(公式:(被缓存时间-过期时间)*100%得到的就是该文件所缓存的时间)
10080是最大缓存时间
override-expire 检查文件过期的时候,先检查文件的最小缓存时间。
override-lastmod 在检查文件过期的百分比的时候,先检查最小缓存时间
reload-into-ims 参数的意思是将client请求的no-cache或reload请求转变成If-Modified-Since,而If-Modified-Since这个参数是用于判断文件 是否被modified,这时squid和RS之间的数据传输仅仅只是验证文件是否更新或更改,如果RS返回的是文件未被更改,则直接由squid的cache文件返回给client,如果更改了,再到后端RS获取最新的文件并被squid缓存,这样做可以节省带宽,增加访问速度,如果不加这个参数,则,如果client请求中有no-cache或reload请求时,squid并不验证自己缓存是否有效,而是直接到RS拿文件返回给client端
ignore-reload 该选项导致squid忽略请求里的任何no-cache指令。所以。如果希望内容一进入cache就不删除,直到被主动purge掉为止,可以加上
ignore-reload选项,该选项一般用户不易发生变化的数据,如MPC,GIF,JPG等等。合理配置此项,都可以将动态页面缓存,但是页面的更新会是一个 很大的问题。
ignore-no-cache 该选项处理http头部信息:
Pragma: no-cache
Cache-control: no-cache
ignore-no-cache ignore-private 处理http头部信息:
Cache-Control: no-cache, must-ridate
Pragma: no-cache
acl localhost src 191.169.0.231
acl manager proto cache_object
http_access allow manager localhost
这是设置本地管理权限,是为了打开squidclient这个工具的使用权限
maximum_object_size 20000 KB
磁盘缓存最大的文件
maximum_object_size_in_memory 256 KB
内存缓存的最大文件
cache_dir ufs /usr/local/squid/var/cache 500 16 256
设置磁盘缓存工作方式,工作路径,大小单位MB,一级HASH的目录数量,二级HASH的目录数量。
emulate_httpd_log on
会使SQUID仿照WEB服务器的格式创建访问记录,如果使用WEB访问分析器,就必须打开这一项。
pid_filename /usr/local/squid/var/logs/squid.pid
access_log /usr/local/squid/var/logs/access.log
cache_log /usr/local/squid/var/logs/cache.log
以上设置PID文件及日志,注意目录权限
dns_testnames mainone
这一项是由于启动的时候,报FATAL: ipcache_init: DNS name lookup tests failed. 可能是由于我的SQUID为配置DNS,导致的问题,这一项是随便写一个或几个真实存在的主机名,只要能够PING通,就可以了,已可以采取在启动SQUID的时候加-D参数。
cache_vary on
该选项为了配合Apache的Deflate的压缩功能使用,如果APACHE开启了压缩,HTTP的头部带有这个ETag/Vary,squid2.6之前是不支持此类头部的缓存。squid默认关闭。
#acl
acl Safe_ports port 80
http_access deny !Safe_ports
acl all src 0.0.0.0/0.0.0.0
http_access allow all
访问控制列表,只开发squid的80端口的访问,允许所有客户端访问。
六、squid启动参数
1.1 首次启动要加-z,目的是建立squid缓存的HASH目录,初始化。
squid命令行选项
-a port
指定新的http_port值。该选项覆盖了来自squid.conf的值。然而请注意,你能在squid.conf里指定多个值。-a选项仅仅覆盖配置文件里的第一个值。(该选项使用字母a是因为在Harvest cache里,HTTP端口被叫做ASCII端口)
-d level
让squid将它的调试信息写到标准错误(假如配置了,就是cache.log和syslog)。level参数指定了显示在标准错误里的消息的最大等级。在多数情况下,d1工作良好。请见16.2章关于调试等级的描述。
-f file
指定另一个配置文件。
-h
显示用法。
-k function
指示squid执行不同的管理功能。功能参数是下列之一:reconfigure, rotate, shutdown, interrupt, kill, debug, check, or parse. reconfigure导致运行中的squid重新读取配置文件。rotate导致squid滚动它的日志,这包括了关闭日志,重命名,和再次打开它们。shutdown发送关闭squid进程的信号。interrupt立刻关闭squid,不必等待活动会话完成。kill发送KILL信号给squid,这是关闭squid的最后保证。debug将squid设置成完全的调试模式,假如你的cache很忙,它能迅速的用完你的磁盘空间。check简单的检查运行中的squid进程,返回的值显示squid是否在运行。最后,parse简单的解析squid.conf文件,如果配置文件包含错误,进程返回非零值。
-s
激活将日志记录到syslog进程。squid使用LOCAL4 syslog设备。0级别调试信息以优先级LOG_WARNING被记录,1级别消息以LOG_NOTICE被记录。更高级的调试信息不会被发送到syslogd.你可以在/etc/syslogd.conf文件里使用如下接口:
local4.warning /var/log/squid.log
-u port
指定另一个ICP端口号,覆盖掉squid.conf文件里的icp_port。
-v
打印版本信息。
-z
初始化cache,或者交换,目录。在首次运行squid,或者增加新的cache目录时,你必须使用该选项。
-C
阻止安装某些信号句柄,它们捕获特定的致命信号例如SIGBUS和SIGSEGV。正常的,这些信号被squid捕获,以便它能干净的关闭。然而,捕获这些信号可能让以后调试问题困难。使用该选项,致命的信号导致它们的默认动作,通常是coredump。
-D
禁止初始化DNS测试。正常情况下,squid直到验证它的DNS可用才能启动。该选项阻止了这样的检测。你也能在squid.conf文件里改变或删除dns_testnames选项。
-F
让squid拒绝所有的请求,直到它重新建立起存储元数据。假如你的系统很忙,该选项可以减短重建存储元数据的时间。然而,如果你的cache很大,重建过程可能会花费很长的时间。
-N
阻止squid变成后台服务进程。
-R
阻止squid在绑定HTTP端口之前使用SO_REUSEADDR选项。
-V
激活虚拟主机加速模式。类似于squid.conf文件里的httpd_accel_host virtual指令。
-X
强迫完整调试模式,如你在squid.conf文件里指定debug_options ALL,9一样。
-Y
在重建存储元数据时,返回ICP_MISS_NOFETCH代替ICP_MISS.忙碌的父cache在重建时,该选项可以导致最少的负载。
1.2
调试工具squidclient
/usr/local/squid/bin/squidclient -h squid监听地址 -p squid监听端口 mgr:info(查看缓存的命中率等信息)
mgr:objects(查看磁盘缓存的文件)
PURGE 手动刷新一个地址或者一个文件的缓存。
chinaunix网友2010-09-21 16:05:43
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com