简介:
九O年代是网际网路大放异彩的年代,尤其是World Wild Web的出现更使得人与人之间的距离越来越小,但是图形、影像和声音的剧增对原本速度就不快的internet来说无疑是雪上加霜,因此大大小小Proxy server便油然而生,其目的是为减轻网路负载,也可加快client端网页浏览的速度。当初proxy server本为保护firewall内主机的安全并做为local与remote间的传输煤介,关如下
Client端不但可以流览网页,也可以透过Proxy存取Inetrnet资源并抵挡外界的网路风暴与破坏。
说明:
Squid Internet Object Cache (Harvest Project的後续版本) 是美国政府大力助的一项研究计画,其目的为解决网路频宽不足的问题,是现在Unix系统上使用者最多功能也最完整的一套软体,目前台湾三大网Tanet、Hinet和Seednet有超过 95%以上的Proxy Server使用。Apache和Netscape虽附有Proxy软体,但因功能简单而不够普及。有关squid的详细说明可到squid网站查询http://squid.nlanr.net/Squid/。
安装说明:
我们这次安装的平台是Pentium 200 MMX,使用32 mb 记忆体,有2.5 gb的硬碟,安装的是Slackware- 3.3 Linux,核心为 linux-2.0.30。目前squid稳定的版本是1.1.16,另有一个并行发展的软体squid- 1.NOVM.16是适合於使用较少虚拟记忆体的主机,如使用的swap memory很小的话可以下载这个版本,但是file descriptors 会变大,确定了我们所要使用的软体後,再来就可以把软体下载到主机中,这次我们使用的是squid-1.1.16.tar.gz,首先用adduser增加一个proxy user,因为使用root帐号开启proxy server会有安全上的问题且程式本身也不允许,再来的动作都由 proxy user来完成,如此才不会有权限不足而导致cache无法写入的影响,把刚传下来的squid-1.1.16.tar.gz用tar解开,进入squid目录中依序输入
./configure --prefix=/usr/local/squid
make all
make install
便完成了所有compiler和install的过程,此时我们的 squid完全install到/usr/local/squid目录下,进入安装完成的目录中或是link过来也可以,我们可以看到三个目录分别是bin、etc与log,进入bin中使用 squid z把要cache的目录建立起来,再来编辑etc目录下的squid.conf,有关 squid.conf语法稍後会详述,完成所有设定後便可以背景执行squid或是放在 /etc/rc里,成一开机便执行的daemon,执行後可使用bin里的client测试squid是否成功的执行,方法 client h localhost p 3128
squid.conf 设定说明:
http_port: squid接受client端http需求使用的阜号,预设 值3128,在命令列中也可使用squid a做设定。
icp_port: squid接收或传送icp讯号所使用的阜号,预设值为3130,如非必要不需做修改,也可使用squid u在命令列中做设定。icp是一种udp_base的封包,主要的功能为web cache主机间连络的讯息格式,也因为是udp_base的封包,所以速度上也就比 client与server间的tcp封包还来的快,可减少cache主机间传送的时间。
cache_host: 设定其它的cache主机,当server收到client端的request时,便透过3130这个port传送 icp给设定中的每一台cache主机,如cache host有client端所需求的资料,便传送一份给server,如没有server便自己抓取资料。例:
cache_host proxy.nsysu.edu.tw sibling 3128 3130 option
第一为hostname。
第二为type 有 “parent” “sibling” “multicast”。
在web cache的阶层里,同一个cache level里以sibling称之,在上位者则为parent,不过在整个 cache level中并没有很明显的分层,所以每一台主机有可能是sibling 或是 parent。当server收到request时,先对所有的sibling和parent送出ICP去询问,等待回应开始对第一个回应HIT的cache抓object,如没有人回覆HIT,就对先回覆 MISS的parent开始抓取,找到资料後送给host并自己cache起来,若都失败server便乖乖的自己去source抓取资料。
第三为proxy_port 为cache主机的porxy port。
第四为icp_port cache主机接收icp的port,通常为3130。
第五为option 有proxy-only、weight=n、ttl=n、no-query、default、round-robin、 multicast-responder等。当proxy server的储存空间很少时,可加上proxy-only,server便不会把资料 cache住,直接将资料送往client。Weight值为与parent间的依赖性,值越大依赖性越大,预设值为1。
Inside_firewall:设定firewall内主机domain。
Local_domain:设定local_domain主要是把这些网域视为本身网域的一部份,如此一来当所要抓取的URL为是在本网域中,则不必再向Neighbor/Sibling询问了,只要是与有直接连线的都可设为local_domain。
Local_ip:与local_domain同。
Neighbor_timeout:当送出icp时等待回应的时间。
Cache_mem:用来储存物件的记忆体大小,包括in-transit、negative和”hot”物件,通常设定实体记忆体的三分之一大小,所谓的实体记忆体是只主记体加上swap memory。In-transit比negative与hot等物件拥有较大的优先权,当有资料进来时, negative与hot objects将会首先被更新,换句话说,两者将会填满所有in-transit objects没有使用的记忆体空间。
Cache_swap: Proxy使用的最大磁碟空间,当使用的空间接近此值的话,cache使用LRU(Least-Recently- Used)的设定来删除过久的资料。Squid对物件的清除是由每个物件的LRU年龄档标准,如太久没用的就会先被清除掉,倘若cache占硬碟的容量低时,物件较不易被清除,但若cache越来越满时,LRU限制较高,资料清除较快。
Cache_log:硬碟中所要当cache的目录。
Log_fqdn:如client有domain name的话,access.log便会把domain name完整的记录下来。
ftp_user:假如需要使用 anonymous ftp来抓取档案,会送出後面所接的字串当 password。
Dns_children: Squid本身附有一个dnsserver程式来处理client端domain name的需求,一般来说,当 proxy有较大的使用量时,dns children设定较多可以处理的domain name request较多也较快,但当设定过多的 dnsserver对系统的performance也会有相当的影响,可使用cache manger来观看每个dnsserver的使用量决定数量的多寡。
Refresh_pattern:更新cache的时间,其演算法则如下:
FRESH if age < min
STALE if expires < now
STALE if age > max
FRESH if lm-factor < percent
使用格式:refresh_pattern regex min percent max
reference_age:物件的LRU,若比值大的话便清除cache中的物件。例如设定一星期,如一星期内没有存取动作,就把物件从cache中移出,假如值为零的话,物件会存放於cache中直到cache swap上限。
Read_time:当proxy与web连接後,经过read_time的时间接收不到web站传送资料便断线,有可能是remote server或是网路连接突然性的中断等因素。
Shutdown_lifetime:当cache server收到SIGTERM或是SIGHUP时,squid会对使用端发出”shutdown pending”讯息,并关掉所有正在进行中的动作,直到squid重新启动。
Cache_mgr: cache server管理者的email信箱,当server无故死掉时,squid会发出一封信至管理者信箱。
Cache_effective_user:启动squid的user名称,包含UID与GID两个栏位。
Err_html_text:使用者浏览网页中,常常遇到不存在或连线中断的网站,squid本身会回应一个error message至用户端,squid管理者可使用这个参数来改变回应至用户端的error message,来连接至管理者的homepage。
Deny_html_text:若遇到access control fail的情况,回应一个access fail message,squid本身提供一个简单的message,可利用此功能连接至homepage。
以上是 squid.conf的大部参数介绍,已包括所有架设一个功能完整的cache server的所有设定。
研究分析:
Squid的特点也是它优於其它cache软体的地方,就是其Access Control Lists的部份,使用acl可设定那些client发出的request会被接受,那些会被挡住,如此可减轻server端网路负载的问题。
首先在squid.conf中定义acl name,以便於之後来设定其存取权。其格式如下:
acl aclname acltype string1…..
acl aclname acltype “file”….
File必须编辑ip name而且每一行只能有一项
acltype有下列几项:
acl aclname src ip-address/netmask
(定义client的ip和netmask)
acl aclname src addr1-addr2/netmask
(定义一段ip address区间和netmask)
acl aclname dst ip-address/netmask
(URL的网路位址和遮罩)
acl aclname srcdomain kyit.edu.tw
(定义反查的domain)
acl aclname dstname kyit.edu.tw
(定义URL的domain)
acl aclname time [day-abbrevs] [h1:m1-h2:m2]
day-abbrevs:星期日至星期六
acl aclname url_regex ^http:// …
(定义符合URL字串的部份)
acl aclname urlpath_regex xxxxx
(定义URL的目录有符合的部份)
acl aclname port 80 ….
(定义所使用的port)
acl aclname proto HTTP FTP …
(定义所使用的通讯协定)
acl aclname browser regexp
(定义client所使用的browser,如IE或Netscape等)
acl aclname user username
(定义存取的username)
预先定义完所有的字串与数值後,再使用後面的参数来做控制的动作,其参数有:
http_access:可设定allow与deny两种,格式为
http_access allow|deny [!]aclname
! 为不包括此aclname
cache_host_acl:类似cache_host,只不过加上aclname。
Squid Proxy server减低网路的负载,也加快client端抓取资料的速度,尤其squid的强大功能更使proxy server更快也更强,对Internet的贡献可谓大且深矣。