Chinaunix首页 | 论坛 | 博客
  • 博客访问: 116483
  • 博文数量: 29
  • 博客积分: 2151
  • 博客等级: 大尉
  • 技术积分: 300
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-20 11:11
文章分类

全部博文(29)

文章存档

2011年(5)

2010年(24)

我的朋友

分类: 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 手动刷新一个地址或者一个文件的缓存。

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

chinaunix网友2010-09-21 16:05:43

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com