squid3.0工作原理及配置文件

本文详细介绍了Squid缓存服务器的工作原理,包括缓存的存放方式、查询方式、服务器间的关系以及运作模式等内容。同时提供了配置文件的具体设置说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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端口的访问,允许所有客户端访问。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值