squid的persistent_connections优化

Squid有三个和保持连接相关的配置参 数:client_persistent_connections, server_persistent_connections, persistent_request_timeout,缺省client_persistent_connections 和 server_persistent_connections是打开的。

运行squidclient -p80 mgr:pconn的结果一般是:

Client-side persistent connection counts:
req/
conn count
---- ---------
0 41388
1 4614958

Server-side persistent connection counts:

req/
conn count
---- ---------
1 739509
2 99170
3 20429
4 5469

client_persistent_connections: 是否打开要看具体应用,反正我是一般不开的,因为现在的IE都是多线程的;打开client_persistent_connections的效果可以通 过squidclient -p80 mgr:pconn监控。

server_persistent_connections对于静态文件型squid,最好打开,也别忘记把后面apache或其它web server的KeepAlive打开;动态服务要随机应变。

persistent_request_timeout 用缺省值基本没问题,建议保持和后端的apache,nginx的keepalive一致。

如何查看squid的缓存命中率

使用命令:  squidclient -h host -p port mgr:info
比如:  /usr/local/squid/bin/squidclient -h 127.0.0.1 -p 8080 mgr:info

使用这个命令的前提是,你在你的squid.conf 中配置了相关的选项
acl manager proto cache_object
http_access allow manager

Squid 高级优化指南

类似的题目网上已经有很多了,为啥我还要写这么一篇?其实是前段时间接手了一个 squid 优化的事情,在网上搜索了一下,发现很多 squid 优化只限于在 squid 参数和系统参数上面的调整。但是这个实在只是细枝末节的事情,只要不是太弱智的配置导致无法缓存,squid的性能不会有太大差距,也就提高10%左右,只有实际的业务针对 squid 进行一些调整,squid 才会真正爆发出他的能量,很多时候有 100%-200% 的提升。

本文基本是一些方向性的指导,并不涉及像具体配置文件的细节,因此本文里面的内容大部分不能往配置文件里面 copy-paste。。

首先要明确一下,squid 能够用来作什么。很多人没有搞明白 squid 的工作原理,只是听说 squid 性能不错可以用来给网站提速,就直接在自己的 website 前面套了一个 squid ,这基本没有任何用处,即使你都是静态页面,后面apache上面没有开 mod_expires,一样缓存不了,squid只能起到一个连接管理的用处。

一般说来,网站用 squid 加速,目的有二

1:  squid 本身具有缓存功能,可以将webserver输出的内容缓存起来,在缓存没有过期之前来的访问,都直接用缓存里面的内容,这样可以有效减少 webserver 机器上面的请求数量。这是 squid 的主要功用。
2: 网络慢的用户会长时间占用 webserver 的 TCP 连接,webserver 对每个连接占用的资源比较大,如果长时间不能释放出来服务其他请求,性能会有比较大的影响。前面放一个 squid, webserver 就可以迅速处理完逻辑以后,把数据快速发送给 squid, 然后去处理别的逻辑,而 squid 每个 TCP 连接占用的资源很少,不用担心占用太多资源。这个用途也叫做连接管理,有一些网络设备也可以做这个事情,价格都很贵。

下面针对 squid 的两种功用,来讲述如何调整业务逻辑和 squid 参数

零:预操作

在搞 squid 之前,不管你用什么编译配置,需要什么特殊选项,都请 –enable-snmp ,并配置好 mrtg 之类,可以图形化的显示 squid 状态,例如 Request Hit Ratio(RHR), Byte Hit Ratio(BHR), 等等,反馈是做一切事情的基础,优化也不例外。

一:缓存

A: 使用 Expires header  来控制缓存

squid在缓存webserver内容的时候,需要后端webserver输出一些控制信息告诉他页面是不是可以被缓存,以及可以缓存多久。否则 squid 是不会自作主张给你缓存内容的。一个页面到底能不能缓存,只有开发网站的人才知道,因此开发人员有责任在动态页面里面输出 Expires 和 Cache-Control header。简单举一个 php 的例子以说明这两个 header 的值是什么含义,其中$expiretime 的单位是秒。

header(”Expires: ” . gmt_date_format(time()+$expiretime));
header(”Cache-Control: max-age=” . “$expiretime”);

对于静态文件,有两种方式来让 squid 自动给静态文件缓存,一种是使用 apache 的 mod_expires ,可以针对路径或者针对文件类型/扩展名来自动输出 cache 头。详细的请参考 mod_expires 的说明 。另一种是用 squid 的 refresh_pattern 来指定。详细的还是请参考 squid 的配置文件。一般来说,如果后端不是配置很麻烦,建议还是在后端做,前端的配置修改大多数都是违背http协议的,如果出现问题,也比较难排查。

B  根据 squid 访问的模式,进行业务拆分

 进行了 Expires Header 的处理以后,squid 就真正可以起到加速的作用了,你可能也能感觉到,网站的访问速度明显加快。但是不要满足于这点成绩,查看 squid 的 snmp 统计图,通常 hit ratio 并不会太高,有 50% 就了不起了。这就是我们需要进一步优化的,我们的目标是让大部分 squid 都达到 9X% 的命中率。

  为什么 squid 命中这么低呢,这大概有两种原因。大多数的网站都是有一些页面不能够被缓存的,例如登录页面。这些页面请求也从 squid 走,成为分母的一部分,直接就降低了命中率,我们首先可以做的事情是,把这些不能够缓存的页面请求,拆分到单独一个 squid 上面,或者访问量不大的话,干脆把 apache 暴露出来。这样能够缓存的那个 squid 命中率马上上升一截。

 有人可能会说,把不能缓存的页面分拆开去,就光为了让能缓存的那个数字好看,这不是掩耳盗铃么?其实这么做是有意义的,首先就是去掉了不能缓存页面的干扰,使得我们进一步优化 squid 的依据更加准确。其次是不可缓存请求和可缓存请求之间的重要性通常是有差距的,分拆了以后,它们之间不容易互相抢占资源,不会因为下载图片的连接太多把 squid 占满,影响更重要的登录请求。第三就是可缓存内容通常是图片等页面元素, 浏览器在 load 它们的时候,对每个站点的并发连接会有控制,如果分开成不同的IP,可以多一些请求同时执行。提高少许显示速度。

  其实观察 sohu, sina 之类的页面,你会发现它们的页面也是分拆的,可以看到页面里面的图片都是指向 images.sohu.com 之类的地址,虽然它们可能和其他页面一样后台都指向同一个 apache。

 这样做完,缓存命中率大概能上升到 70%-80% 了,运气好的时候完全可以上 90%。

   另一种导致 squid 命中低的原因和这个比较类似,同样都是可缓存的内容,有的可能是软件下载站上面的大文件,有的是新闻站点上面的小图片,如果同一个 squid 对这样差别巨大的文件加速的话,会严重干扰 squid 的缓存策略,两者不能兼顾,要不就是大文件占据了 cache ,把小文件都挤出了 cache, 要不就是小文件特别多,大文件无法进入 cache, 导致大文件经常 miss 。这个比不能缓存的页面还要恶心,因此即使在服务器资源有限的情况下,也要优先拆分这两类型访问。一般来说,文件大小分界线定在 1M 左右就可以了,如果是有软件下载这样特别大的文件,可以在 4M – 10M 左右再拆分一次。对于不同访问类型的 squid, 其系统优化参数也会有所不同,这个我们后面还会讲到。

   只要悉心按照访问模式来拆分业务,大部分起缓存作用的 squid 都可以达到很高的命中率,至少都可以到达 9X%。



C 根据不同的需求,调整参数优化缓存

完成 A 和 B 两步优化以后, squid 的命中率经常可以达到 9x%, 可以说我们已经给 squid 创造了非常优秀的外部环境,下面我们就要从 squid 本身入手,通过调整它的缓存参数和缓存策略,甚至系统的参数,来让 squid 发挥出更好的性能。

在 B 步骤中,我们把 squid 划分成了三种用途,缓存大文件,缓存小文件,不缓存文件,这其中最后一种用途情况下面 squid 不起到缓存效果,只用来做连接管理,因此我们把它放到后面的连接管理里面叙述,这里只讨论和缓存相关的 squid 参数。
squid 有内存缓存和磁盘缓存两级缓存, 通常来说, 只要是专门给 squid 用的机器, 内存缓存都建议开得比较大, 大内存缓存总是有好处的嘛, 但是注意不要使得系统开始吃 swap ,像Linux这样一开始吃 swap 性能就下降比较严重的系统尤其要注意. 这个程度需要自己试验确定.
通常 1G 内存的Linux机器用来跑 squid ,内存缓存可以开到 512M.

有些libc比较差的平台, 例如比较老的 freebsd 系统, 其 malloc 函数的质量不高,可能会造成比较多的内存碎片,导致 squid 运行一段时间以后分配不出来内存挂掉. 这时候推荐在编译时候使用 dlmalloc package. 即使如此, 仍然要再缩小 squid 的内存缓存,以防不幸发生.

磁盘缓存的情况比较复杂, 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 好, 需要具体问题具体分析

前面说到, ufs/aufs/diskd都是在文件系统上面存储很多小文件,因此文件系统本身的特性严重影响了squid缓存的性能,对于 Linux ,强烈推荐用 reiserfs 等适合处理小文件的文件系统, bsd 则至少要打开 softupdate, 以及 dirhash 等一切对很多小文件有好处的选项. 在比较新的系统上面, reiserfs 等文件系统的性能已经足够优越, 通常 ufs 就已经可以应付需要. 对于一些老系统,使用 aufs 或者 diskd 是比较好的选择,如果系统的线程库比较好(如Linux,Solaris),那么使用 aufs, 否则 diskd.
也有一些例外情况, 比如多 cpu 的 Linux 2.6 系统, 线程库很优秀, 虽然 ufs 本身已经比较快了,但是 squid 单进程无法利用另外的 cpu , 不如使用 aufs , 让另外的 cpu 也可以起到一些作用, aufs 在编译的时候可以选择使用几个读写线程. 这个个人觉得稍微超过 cpu 个数就可以了.但是并没有实际测试过.

磁盘缓存开多大? 这个问题没有固定答案. 需要经过试验来确定, 一般来说开大一些没有太大问题. 只要你的硬盘足够大。

最后致谢一下 windtear ,这位是 squid 之王, Lord of Squid, 业务分拆是从他那里学来的。致敬。

squid.conf中少了transparent

访问是会出现如下错误:

错误
您所请求的网址(URL)无法获取

--------------------------------------------------------------------------------

当尝试进行以下请求时:

GET /forum-6-1.html HTTP/1.1
Accept: */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TheWorld)
Host: www.example.com
Connection: Keep-Alive
Cookie: rtime=29; ltime=1312185462343; cnzz_eid=47033647-1307597230-; cnzz_a2967008=9; sin2967008=; pgv_pvi=5092063248; Hm_lvt_19a7cf164294dff4a56c7490c27fa037=1312185462593; __utma=25581497.895693467.1307600638.1312169477.1312185463.79; __utmz=25581497.1307600638.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); lzstat_uv=37664384421587457303|926044@1265351@793358@1072479@1148619@869108@788690@1275240@1246808; i0B_cookietime=2592000; i0B_sid=XogUqO; i0B_visitedfid=6D19D2D21; i0B_auth=ZvBZGLoCB97WXv20ZnMuhh0CPFc1XmWvr6v8Sfh1WgfrmtnLkh84%2B8xBRaQjoh7yN2knN6MlZGKccCThnNCZtu%2FHWcPxjPnpDgs%2BDGmh%2B7r0FxIYI%2FaK09CjRxQ2nQ1uvjKb9bcaFDZia13orh37; i0B_uc_uid=2042498; pgv_info=ssi=s2496081862; Hm_lpvt_19a7cf164294dff4a56c7490c27fa037=1312185462593; __utmb=25581497.1.10.1312185463; __utmc=25581497; checkpm=1; i0B_pmnum=0


发生了下列的错误:

Invalid Request
无效的请求
Some aspect of the HTTP Request is invalid. Possible problems:
HTTP 请求的某些方面是无效的。可能是下列问题:

Missing or unknown request method
缺少请求方式或未知的请求方式
Missing URL
缺少网址
Missing HTTP Identifier (HTTP/1.0)
缺少 HTTP 标识(HTTP/1.0)
Request is too large
请求命令过长
Content-Length missing for POST or PUT requests
POST 或 PUT 请求缺少内容长度
Illegal character in hostname; underscores are not allowed
主机名称中包含不合法的字符;下划线是不允许的。


解决办法:
vim  squid.conf
把"http_port 80" 改成 "http_port 80 transparent"

根据需求配置你的squid——进阶篇

5.1其它配置选项  
在进行squid的一些高级应用之前,我们有必要对其他有用的配置选项作一个全面的了解。下面我们分类来讲一讲这些选项,用于某些特殊应用的选项我们将放在讲该种应用时来讲。  

5.1.1网络选项  
1.tcp_incoming_address  
tcp_outgoing_address  
udp_incoming_address  
udp_outgoing_address  
说明:  
tcp_incoming_address指定监听来自客户或其他squid代理服务器的绑定ip地址;  
tcp_outgoing_address指定向远程服务器或其他squid代理服务器发起连接的ip地址  
udp_incoming_address为ICP套接字指定接收来自其他squid代理服务器的包的ip地址 udp_outgoing_address为ICP套接字指定向其他squid代理服务器发送包的ip地址;  
缺省为没有绑定任何ip地址。该绑定地址可以用ip指定,也可以用完整的域名指定。  

5.1.2交换空间设定选项  
1.cache_swap_low (percent, 0-100)  
cache_swap_high (percent, 0-100)  
说明:squid使用大量的交换空间来存储对象。那么,过了一定的时间以后,该交换空间就会用完,所以还必须定期的按照某种指标来将低于某个水平线的对象清除。squid使用所谓的“最近最少使用算法”(LRU)来做这一工作。当已使用的交换空间达到cache_swap_high时,squid就根据LRU所计算的得到每个对象的值将低于某个水平线的对象清除。这种清除工作一直进行直到已用空间达到cache_swap_low。这两个值用百分比表示,如果你所使用的交换空间很大的话,建议你减少这两个值得差距,因为这时一个百分点就可能是几百兆空间,这势必影响squid的性能。缺省为:  
cache_swap_low 90  
cache_swap_high 95  
2.maximum_object_size  
说明:大于该值得对象将不被存储。如果你想要提高访问速度,就请降低该值;如果你想最大限度地节约带宽,降低成本,请增加该值。单位为K,缺省值为:  
maximum_object_size 4096 KB  

5.1.3有关日志的选项  
1.cache_access_log  
说明:指定客户请求记录日志的完整路径(包括文件的名称及所在的目录),该请求可以是来自一般用户的HTTP请求或来自邻居的ICP请求。缺省值为:  
cache_access_log /var/log/squid/access.log  
如果你不需要该日志,可以用以下语句取消:cache_access_log none  
2.cache_store_log  
说明:指定对象存储记录日志的完整路径(包括文件的名称及所在的目录)。该记录表明哪些对象被写到交换空间,哪些对象被从交换空间清除。缺省路径为:  
cache_log /var/log/squid/cache.log  
如果你不需要该日志,可以用以下语句取消:cache_store_log none  
3.cache_log  
说明:指定squid一般信息日志的完整路径(包括文件的名称及所在的目录)。  
缺省路径为:cache_log /var/log/squid/cache.log  
4.cache_swap_log  
说明:该选项指明每个交换空间的“swap.log”日志的完整路径(包括文件的名称及所在的目录)。该日志文件包含了存储在交换空间里的对象的元数据(metadata)。通常,系统将该文件自动保存在第一个“cache_dir”说定义的顶级目录里,但是你也可以指定其他的路径。如果你定义了多个“cache_dir”,则相应的日志文件可能是这样的:  
cache_swap_log.00  
cache_swap_log.01  
cache_swap_log.02  
后面的数字扩展名与指定的多个“cache_dir”一一对应。  
需要注意的是,最好不要删除这类日志文件,否则squid将不能正常工作。  
5.pid_filename  
说明:指定记录squid进程号的日志的完整路径(包括文件的名称及所在的目录)。缺省路径为  
pid_filename /var/run/squid.pid  
如果你不需要该文件,可以用以下语句取消:pid_filename none  
6.debug_options  
说明:控制作日志时记录信息的多寡。可以从两个方面控制:section控制从几个方面作记录;level控制每个方面的记录的详细程度。推荐的方式(也是缺省方式)是:debug_options ALL,1  
即,对每个方面都作记录,但详细程度为1(最低)。  
7.log_fqdn on|off  
说明:控制在 access.log 中对用户地址的记录方式。打开该选项时,squid记录客户的完整域名,取消该选项时,squid记录客户的ip地址。注意,如果打开该选项会增加系统的负担,因为squid还得进行客户ip的DNS查询。缺省值为:log_fqdn off  

5.1.4有关外部支持程序的选项  
1.ftp_user  
说明:设置登录匿名ftp服务器时的提供的电子邮件地址,登录匿名ftp服务器时要求用你的电子邮件地址作为登录口令(更多的信息请参看本书的相关章节)。需要注意的是,有的匿名ftp服务器对这一点要求很苛刻,有的甚至会检查你的电子邮件的有效性。缺省值为:ftp_user Squid@  
2.ftp_list_width  
说明:设置ftp列表的宽度,如果设得太小将不能的浏览到长文件名。缺省值为: ftp_list_width 32  
3.cache_dns_program  
说明:指定DNS查询程序的完整路径(包括文件的名称及所在的目录)。缺省路径为:  
cache_dns_program /usr/lib/squid/dnsserver  
4.dns_children  
说明:设置DNS查询程序的进程数。对于大型的登录服务器系统,建议该值至少为10。最大值可以是32,缺省设置为5个。注意,如果你任意的降低该值,可能会使系统性能急剧降低,因为squid主进程要等待域名查询的结果。没有必要减少该值,因为DNS查询进程并不会消耗太多的系统的资源。  
5.dns_nameservers  
说明:指定一个DNS服务器列表,强制squid使用该列表中的DNS服务器而非使用/etc/resolv.conf文件中定义的DNS服务器。你可以这样指定多个DNS服务器:dns_nameservers 10.0.0.1 192.172.0.4  
缺省设置为:dns_nameservers none  
6.unlinkd_program  
说明:指定文件删除进程的完整路径。  
缺省设置为:  
unlinkd_program /usr/lib/squid/unlinkd  
7.pinger_program  
说明:指定ping进程的完整路径。该进程被squid利用来测量与其他邻居的路由距离。该选项只在你启用了该功能时有用。缺省为:  
pinger_program /usr/lib/squid/pinger  
8.authenticate_program  
说明:指定用来进行用户认证的外部程序的完整路径。squid的用户认证功能我们将在后面的章节讲述。缺省设置为不认证。  

5.1.5用户访问控制选项  
1.request_size (KB)  
说明:设置用户请求通讯量的最大允许值(单位为KB)。如果用户用POST方法请求时,应该设一个较大的值。缺省设置为:  
request_size 100 KB  
2.reference_age  
说明:squid根据对象的LRU(最近最少使用算法)来清除对象,squid依据使用磁盘空间的总量动态地计算对象的LRU年龄。我们用reference_age定义对象的最大LRU年龄。如果一个对象在指定的reference_age内没有被访问,squid将删除该对象。缺省值为一个月。你可以使用如下所示的时间表示方法。  
1 week  
3.5 days  
4 months  
2.2 hours  
3.quick_abort_min (KB)  
quick_abort_max (KB)  
quick_abort_pct (percent)  
说明:控制squid是否继续传输被用户中断的请求。当用户中断请求时,squid将检测  
quick_abort 的值。如果剩余部分小于“quick_abort_min”指定的值,squid 将继续完成剩余部分的传输;如果剩余部分大于“quick_abort_max”指定的值,squid 将终止剩余部分的传输;如果已完成“quick_abort_pct”指定的百分比,squid将继续完成剩余部分的传输。缺省的设置为:  
quick_abort_min 16 KB  
quick_abort_max 16 KB  
quick_abort_pct 95  

5.1.6各类超时设置选项  
1.negative_ttl time-units  
说明:设置消极存储对象的生存时间。所谓的消极存储对象,就是诸如“连接失败”及"404 Not Found"等一类错误信息。缺省设置为:negative_ttl 5 minutes  
2.positive_dns_ttl time-units  
说明:设置缓存成功的DNS查询结果的生存时间。缺省为6小时。  
positive_dns_ttl 6 hours  
3.negative_dns_ttl time-units  
说明:设置缓存失败的DNS查询结果的生存时间。缺省为5分钟。  
negative_dns_ttl 5 minutes  
4.connect_timeout time-units  
说明:设置squid等待连接完成的超时值。缺省值为2分钟。  
connect_timeout 120 seconds  
5.read_timeout time-units  
说明:如果在指定的时间内squid尚未从被请求的服务器读入任何数据,则squid将终止该客户请求。缺省值为15分钟。  
read_timeout 15 minutes  
6.request_timeout  
说明:设置在建立与客户的连接后,squid将花多长时间等待客户发出HTTP请求。缺省值为30秒。  
request_timeout 30 seconds  
7.client_lifetime time-units  
说明:设置客户在与squid建立连接后,可以将该连接保持多长时间。  
注意,因为客户建立的每个连接都会消耗一定的系统资源,所以如果你是为一个大型网络提供代理服务的话,一定要正确地修改该值。因为如果同一时间的连接数量太大的话,可能会消耗大量的系统资源,从而导致服务器宕机。缺省值为1天,该值太大了,建议根据你自己的情况适当减小该值。  
client_lifetime 1 day  
8.half_closed_clients on/off  
说明:有时候由于用户的不正常操作,可能会使与squid的TCP连接处于半关闭状态,  
这时候,该TCP连接的发送端已经关闭,而接收端正常工作。缺省地,squid将一直保持这种处于半关闭状态的TCP连接,直到返回套接字的读写错误才将其关闭。如果将该值设为off,则一旦从客户端返回“no more data to read”的信息,squid就立即关闭该连接。half_closed_clients on  
9.pconn_timeout  
说明:设置squid在与其他服务器和代理建立连接后,该连接闲置多长时间后被关闭。缺省值为120秒。  
pconn_timeout 120 seconds  
10.ident_timeout  
说明:设置squid等待用户认证请求的时间。缺省值为10秒。  
ident_timeout 10 seconds  
11.shutdown_lifetime time-units  
说明:当收到SIGTERM 或者 SIGHUP 信号后, squid将进入一种shutdown pending的模式,等待所有活动的套接字关闭。在过了shutdown_lifetime所定义的时间后,所有活动的用户都将收到一个超时信息。缺省值为30秒。  
shutdown_lifetime 30 seconds  

5.1.7管理参数选项  
1.cache_mgr  
说明:设置管理员邮件地址。缺省为:  
cache_mgr root  
2. cache_effective_user  
cache_effective_group  
说明:如果用root启动squid,squid将变成这两条语句指定的用户和用户组。缺省变为squid用户和squid用户组。注意这里指定的用户和用户组必须真是存在于/etc/passwd中。如果用非root帐号启动squid,则squid将保持改用户及用户组运行,这时候,你不能指定小于1024地http_port。  
cache_effective_user squid  
cache_effective_group squid  
3.visible_hostname  
说明:定义在返回给用户的出错信息中的主机名。  
如: visible_hostname www-cache.foo.org  
4.unique_hostname  
说明:如果你有一个代理服务器阵列,并且你为每个代理服务器指定了同样的“visible_hostname”,同时你必须为它们指定不同的“unique_hostname”来避免“forwarding loops ”(传输循环)发生。  

5.1.8其它杂项  
1. dns_testnames  
说明:设置进行DNS查询测试,如果第一个站点解析成功则立即结束DNS查询测试。如果你不愿意进行DNS查询测试,就不要去掉缺省的设置。  
#dns_testnames netscape.com internic.net nlanr.net microsoft.com  
2.logfile_rotate  
说明:通常,squid会定期的将日志文件更名并打包。比如正在使用的日志文件为access.log,squid会将其更名并打包为access.log.1.gz;过了一定时间后,squid又会将  
access.log.1.gz更名为access.log.2.gz并将当前的日志文件更名并打包为access.log.1.gz,以此循环。logfile_rotate所指定的数字即为打包并备份的文件的数量,当达到这一数目时,squid将删除最老的备份文件。缺省值为10。如果你想手动来进行这些操作,你可以用logfile_rotate 0来取消自动操作。  
3.err_html_text  
说明:用该语句定义一个字符串变量,可以用%L在返回给用户的错误信息文件中引用。错误信息文件通常在/etc/squid/errors目录中,这是一些用HTML写成的脚本文件,你可以自己修改它。  
4.deny_info  
说明:你可以定制自定义的拒绝访问信息文件,并且可以和不同的用户列表相关联。当用户被http_access相关规则拒绝时,squid可以向用户显示你自定义的相应的拒绝访问信息文件。语法为:  
Usage: deny_info err_page_name acl  
比如:  
deny_info ERR_CUSTOM_ACCESS_DENIED bad_guys  
5.memory_pools on|off  
说明:如果你将该项设为on,则squid将保留所有已经分配(但是未使用)的内存池以便在将来使用。缺省为on.  
memory_pools on  
6.log_icp_queries on|off  
说明:设置是否对ICP请求作日志。如果你的系统负载很大,你可以用off来取消该功能。缺省为:  
log_icp_queries on  
7.always_direct  
说明:该选项允许你指定某些用户类,squid将这些用户类的请求直接转发给被请求的服务器。语法为:  
always_direct allow|deny [!]aclname ...  
如:直接转发FTP请求可以这样设置:  
acl FTP proto FTP  
always_direct allow FTP  
8.never_direct  
说明:与always_direct相反。语法为:  
Usage: never_direct allow|deny [!]aclname ...  
比如,为了强制除了本地域的其他用户使用代理服务器,你可以这样设置:  
acl local-servers dstdomain foo.net  
acl all src 0.0.0.0/0.0.0.0  
never_direct deny local-servers  
never_direct allow all  
9.icon_directory  
说明:指明向用户传送错误信息时所用到的图标文件的目录。缺省路径为: icon_directory /usr/lib/squid/icons  
10.error_directory  
说明:指明向用户传送错误信息所用到的错误描述文件的目录。缺省路径为:  
error_directory /etc/squid/errors  

5.2 用户认证设置  
缺省的,squid本身不带任何认证程序,但是我们可以通过外部认证程序来实现用户认证。一般说来有以下的认证程序:  
1.LDAP认证:你可以访问以下资源来获取更多的有用信息。  
http://www.geocities.com/Researc ... 5292/projects/ldap/  
http://home.iae.nl/users/devet/s ... ib/ldap_auth.tar.gz  
2.SMB认证:可以实现基于NT和samba的用户认证。更多的信息请访问以下资源。  
http://www.hacom.nl/~richard/software/smb_auth.html  
3.基于mysql的用户认证。  
http://home.iae.nl/users/devet/s ... ontrib/mysql_auth.c  
4.基于sock5密码用户认证。  
http://nucleo.freeservers.com/  
5.基于Radius 的用户认证。  
http://home.iae.nl/users/devet/squid/proxy_auth/contrib/auth.pl  
但是我们一般常用的是用ncsa实现的认证和用smb_auth实现的基于NT和samba的用户认证。下面我们就来讲这两种认证方法的具体实现。  

5.2.1 ncsa用户认证的实现  
ncsa是squid源代码包自带的认证程序之一,下面我们以squid-2.3.STABLE2版本为例讲述ncsa的安装和配置。  
1.从www.squid-cache.org下载squid源代码包squid-2.3.STABLE2-src.tar.gz并放到/tmp目录下。  
2.用tar解开:  
tar xvzf squid-2.3.STABLE2-src.tar.gz  
%make  
%make install  
3.然后,进入/tmp/squid-2.3.STABLE2/auth_modules/NCSA目录。  
% make  
% make install  
编译成功后,会生成ncsa_auth的可执行文件。  
4.拷贝生成的执行文件ncsa_auth到/usr/bin目录  
cp ncsa_auth /usr/bin/bin  
5.修改squid.conf中的相关选项如下所示:  
authenticate_program /usr/local/squid/bin/ncsa_auth /usr/bin/passwd  
6.定义相关的用户类  
acl auth_user proxy_auth REQUIRED  
注意,REQUIRED关键字指明了接收所有合法用户的访问。  
7.设置http_access  
http_access allow auth_user  
注意,如果你在改行中指定了多个允许访问的用户类的话,应该把要认证的用户类放在第一个。如下所示:  
错误的配置:http_access allow auth_user all manager  
正确的配置:http_access allow auth_user manager all  
8.利用apache携带的工具软件htpasswd在/usr/local/squid/etc下生成密码文件并添加相应的用户信息。一般说来,该密码文件每行包含一个用户的用户信息,即用户名和密码。  
用htpasswd生成密码文件passwd并添加用户bye。  
htpasswd -c /usr/local/squid/etc/passwd bye  
然后重新启动squid,密码认证已经生效。  

5.2.2 smb用户认证的实现  
国内介绍并使用ncsa实现用户认证的文章不多,而使用smb_auth和samba实现基于NT的用户认证我还没有看到过,下面我们就来看一看在squid中实现基于NT的用户认证。  
当前smb_auth的最高版本是smb_auth-0.05,你可以在以下地址下载。当然,squid的源代码包中也包含smb_auth,但是是0.02版的。  
http://www.hacom.nl/~richard/software/smb_auth-0.05.tar.gz  
smb_auth的主页地址是http://www.hacom.nl/~richard/software/smb_auth.html。  
1.系统需求:  
squid2.0以上版本。  
安装samba2.0.4以上版本。你并不需要运行samba服务,因为smb_auth只用到了 samba的客户端软件。  
2.下载smb_auth-0.05.tar.gz并复制到/tmp.  
3.tar xvzf smb_auth-0.05.tar.gz  
4.根据你的要求修改Makefile中的SAMBAPREFIX和INSTALLBIN参数。SAMBAPREFIX指定了你的samba安装路径,INSTALLBIN指明了smb_auth的安装路径。我们指定:  
SAMBAPREFIX=/usr,INSTALLBIN=/usr/bin.  
5.make  
6.make install,成功后会在INSTALLBIN指定路径中生成可执行文件smb_auth.  
7.按下列步骤设置你要用于认证的主域控制器:  
首先在NETLOG共享目录中建立一个“proxy”文件,该文件只包含一个“allow”的字符串,一般说来,该NETLOG目录位于winntsystem32Replimportscripts目录中;然后,设置所有你想让其访问squid的用户和用户组拥有对该文件的读的权力。  
8.修改squid.conf中的相关选项如下所示:  
authenticate_program /usr/local/squid/bin/smb_auth your_domain_name  
9.定义相关的用户类  
acl auth_user proxy_auth REQUIRED  
注意,REQUIRED关键字指明了接收所有合法用户的访问。  
10.设置http_access  
http_access allow auth_user  
注意,如果你在改行中指定了多个允许访问的用户类的话,应该把要认证的用户类放在第一个。如下所示:  
错误的配置:http_access allow auth_user all manager  
正确的配置:http_access allow auth_user manager all  
如果一切正确的话,然后重新启动squid,密码认证已经生效。  
说明:smb_auth的调用方法:  
1.smb_auth -W your_domain_name  
用your_domain_name指定你的域名。smb_auth将进行广播寻找该主域控制器。  
2.smb_auth -W your_domain_name -B  
如果你有多个网络接口,可以用-B 指定用于广播的网络接口的ip地址。  
3.smb_auth -W your_domain_name -U  
也可以用-U直接指定该主域控制器的ip地址。  
4.smb_auth -W your_domain_name -S share  
可以用-S指定一个不同于NETLOG的共享目录。  

5.2.3 squid.conf中关于认证的其他设置  
1.authenticate_children  
说明:设置认证子进程的数目。缺省为5个。如果你处于一个繁忙的网络环境中,你可以适当增大该值。  
2.authenticate_ttl  
说明:设置一次认证的有效期,缺省是3600秒。  
3.proxy_auth_realm  
说明:设置用户登录认证时向用户显示的域名。  

5.3透明代理的设置  
关于透明代理的概念我们已经在第一节将过了,下面我们看一下怎么样在squid中实现透明代理。  
透明代理的实现需要在Linux 2.0.29以上,但是Linux 2.0.30并不支持该功能,好在我们现在使用的通常是2.2.X以上的版本,所以不必担心这个问题。下面我们就用ipchains+squid来实现透明代理。在开始之前需要说明的是,目前我们只能实现支持HTTP的透明代理,但是也不必太担心,因为我们之所以使用代理,目的是利用squid的缓存来提高Web的访问速度,至于提供内部非法ip地址的访问及提高网络安全性,我们可以用ipchains来解决。  
实现环境:RedHat6.x+squid2.2.x+ipchains  

5.3.1 linux的相关配置  
确定你的内核已经配置了以下特性:  
Network firewalls  
[ ] Socket Filtering  
Unix domain sockets  
TCP/IP networking  
[ ] IP: multicasting  
[ ] IP: advanced router  
[ ] IP: kernel level autoconfiguration  
IP: firewalling  
[ ] IP: firewall packet netlink device  
IP: always defragment (required for masquerading)  
IP: transparent proxy support  
如果没有,请你重新编译内核。一般在RedHat6.x以上,系统已经缺省配置了这些特性。  

5.3.2squid的相关配置选项  
设置squid.conf中的相关选项,如下所示:  
http_port 3218  
httpd_accel_host virtual  
httpd_accel_port 80  
httpd_accel_with_proxy on  
httpd_accel_uses_host_header on  
说明:  
1.http_port 3128  
在本例中,我们假设squid的HTTP监听端口为3128,即squid缺省设置值。然后,把所有来自于客户端web请求的包(即目标端口为80)重定向到3128端口。  
2.httpd_accel_host virtual  
httpd_accel_port 80  
这两个选项本来是用来定义squid加速模式的。在这里我们用virtual来指定为虚拟主机模式。80端口为要加速的请求端口。采用这种模式时,squid就取消了缓存及ICP功能,假如你需要这些功能,这必须设置httpd_accel_with_proxy选项。  
3.httpd_accel_with_proxy on  
该选项在透明代理模式下是必须设置成on的。在该模式下,squid既是web请求的加速器,又是缓存代理服务器。  
4.httpd_accel_uses_host_header on  
在透明代理模式下,如果你想让你代理服务器的缓存功能正确工作的话,你必须将该选项设为on。设为on时,squid会把存储的对象加上主机名而不是ip地址作为索引。这一点在你想建立代理服务器阵列时显得尤为重要。  

5.3.3 ipchains的相关配置  
ipchains在这里所起的作用是端口重定向。我们可以使用下列语句实现将目标端口为80端口的TCP包重定向到3128端口。  
#接收所有的回送包  
/sbin/ipchains -A input -j ACCEPT -i lo  
#将目标端口为80端口的TCP包重定向到3128端口  
/sbin/ipchains -A input -p tcp -d 0.0.0.0/0 80 -j REDIRECT 80  
当然在这以前,我们必须用下面的语句打开包转发功能。  
echo 1 >; /proc/sys/net/ipv4/ip_forward

squid日志详解

squid的日志很重要。常常要了解的,其中最重要的就是命中率啦,不然反向代理做的用就不大。

#cat access.log|gawk ‘{print $4}’|sort|uniq -c|sort -nr

9568 TCP_IMS_HIT/304
6313 TCP_HIT/200
2133 TCP_MISS/200
1568 TCP_MISS/206
587 TCP_MEM_HIT/200
531 TCP_MISS/304
207 TCP_REFRESH_HIT/200
152 TCP_REFRESH_HIT/304
86 TCP_NEGATIVE_HIT/404
69 TCP_MISS/404
9 TCP_MISS/000
4 TCP_MISS/503
1 TCP_REFRESH_MISS/000
1 TCP_DENIED/400

可以使用上面的方法,大约的分析一下命令中比。什么意思就看下面的详解.

#cat /var/log/squid/access.log |grep TCP_MEM_HIT

如果看到很多的TCP_MEM_HIT ,这表明该文件是从内存缓存读取的,squid已经起作用了!你再用浏览器打开该文件,应该是快如闪电了。。呵呵,大功告成了!还有其他类型的HIT,如TCP_HIT等等,这些是从磁盘读取的,我觉得加速的意义不大,只不过缓解了apache的压力而已。

相应于HTTP请求,下列标签可能出现在access.log文件的第四个域。

TCP_HIT

Squid发现请求资源的貌似新鲜的拷贝,并将其立即发送到客户端。

TCP_MISS

Squid没有请求资源的cache拷贝。

TCP_REFERSH_HIT

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器返回304(未修改)响应,指示squid的拷贝仍旧是新鲜的。

TCP_REF_FAIL_HIT

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。然而,原始服务器响应失败,或者返回的响应Squid不能理解。在此情形下,squid发送现有cache拷贝(很可能是陈旧的)到客户端。

TCP_REFRESH_MISS

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器响应新的内容,指示这个cache拷贝确实是陈旧的。

TCP_CLIENT_REFRESH_MISS

Squid发现了请求资源的拷贝,但客户端的请求包含了Cache-Control: no-cache指令。Squid转发客户端的请求到原始服务器,强迫cache确认。

TCP_IMS_HIT

客户端发送确认请求,Squid发现更近来的、貌似新鲜的请求资源的拷贝。Squid发送更新的内容到客户端,而不联系原始服务器。

TCP_SWAPFAIL_MISS

Squid发现请求资源的有效拷贝,但从磁盘装载它失败。这时squid发送请求到原始服务器,就如同这是个cache丢失一样。

TCP_NEGATIVE_HIT

在对原始服务器的请求导致HTTP错误时,Squid也会cache这个响应。在短时间内对这些资源的重复请求,导致了否命中。 negative_ttl指令控制这些错误被cache的时间数量。请注意这些错误只在内存cache,不会写往磁盘。下列HTTP状态码可能导致否定 cache(也遵循于其他约束): 204, 305, 400, 403, 404, 405, 414, 500, 501, 502, 503, 504。

TCP_MEM_HIT

Squid在内存cache里发现请求资源的有效拷贝,并将其立即发送到客户端。注意这点并非精确的呈现了所有从内存服务的响应。例如,某些cache在内存里,但要求确认的响应,会以TCP_REFRESH_HIT, TCP_REFRESH_MISS等形式记录。

TCP_DENIED

因为http_access或http_reply_access规则,客户端的请求被拒绝了。注意被http_access拒绝的请求在第9域的值是NONE/-,然而被http_reply_access拒绝的请求,在相应地方有一个有效值。

TCP_OFFLINE_HIT

当offline_mode激活时,Squid对任何cache响应返回cache命中,而不用考虑它的新鲜程度。

TCP_REDIRECT

重定向程序告诉Squid产生一个HTTP重定向到新的URI(见11.1节)。正常的,Squid不会记录这些重定向。假如要这样做,必须在编译squid前,手工定义LOG_TCP_REDIRECTS预处理指令。

NONE

无分类的结果用于特定错误,例如无效主机名。

相应于ICP查询,下列标签可能出现在access.log文件的第四域。

UDP_HIT

Squid在cache里发现请求资源的貌似新鲜的拷贝。

UDP_MISS

Squid没有在cache里发现请求资源的貌似新鲜的拷贝。假如同一目标通过HTTP请求,就可能是个cache丢失。请对比UDP_MISS_NOFETCH。

UDP_MISS_NOFETCH

跟UDP_MISS类似,不同的是这里也指示了Squid不愿去处理相应的HTTP请求。假如使用了-Y命令行选项,Squid在启动并编译其内存索引时,会返回这个标签而不是UDP_MISS。

UDP_DENIED

因为icp_access规则,ICP查询被拒绝。假如超过95%的到某客户端的ICP响应是UDP_DENIED,并且客户端数据库激活了(见附录A),Squid在1小时内,停止发送任何ICP响应到该客户端。若这点发生,你也可在cache.log里见到一个警告。

UDP_INVALID

Squid接受到无效查询(例如截断的消息、无效协议版本、URI里的空格等)。Squid发送UDP_INVALID响应到客户端

squid.conf 配置文件样例 for squid-2.6

http_port 80 transparent

cache_replacement_policy lru
cache_dir aufs /log/squid/cache1 8192 16 256
cache_dir aufs /log/squid/cache2 4096 16 256
cache_mem 2048 MB
maximum_object_size 2048 KB
maximum_object_size 1 MB
maximum_object_size_in_memory 512 KB

visible_hostname cache.ccc.com

client_persistent_connections off
server_persistent_connections on
#persistent_connection_after_error on

memory_pools on
memory_pools_limit 1024 MB

forwarded_for on
log_icp_queries off
#reload_into_ims off
#half_closed_clients off
cache_mgr [email protected]
via on
httpd_suppress_version_string off


cache_effective_user squid
cache_effective_group squid

error_directory /usr/local/squid/share/errors/Simplify_Chinese
icon_directory /usr/local/squid/share/icons
mime_table /usr/local/squid/etc/mime.conf


ie_refresh off
tcp_recv_bufsize 32 KB

acl all src 0.0.0.0/0.0.0.0
acl localhost src 127.0.0.0/8
acl Mgr_ip src 127.0.0.0/8
acl allow_ip dst 127.0.0.0/8  192.168.0.0/16
acl Purge_ip src 127.0.0.0/8  192.168.0.0/16
acl PURGE method PURGE
acl allow_Domain dstdomain .ccc.com
acl Safe_ports port 80 8080
acl CONNECT method CONNECT
acl manager proto cache_object
acl HTTP proto HTTP

http_access allow allow_Domain
http_access allow allow_ip
http_access allow manager Mgr_ip
http_access deny manager
http_access allow PURGE Purge_ip
http_access deny PURGE
http_access deny !Safe_ports
http_access deny all
icp_access deny all

#cache_peer 127.0.0.1 parent 80 0 no-query no-digest no-netdb-exchange originserver name=BLOG
#acl BLOG_DOMAIN dstdom_regex .*\.blog\.ccc\.com
#cache_peer_access BLOG allow BLOG_DOMAIN

ipcache_size 1024
ipcache_low 90
ipcache_high 95

memory_replacement_policy lru

#hosts_file /etc/hosts
request_header_max_size 128 KB

hierarchy_stoplist cgi-bin ? \.php \.html
acl QUERY urlpath_regex cgi-bin \? \.php \.html
cache deny QUERY

request_body_max_size 0 KB

refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
#refresh_pattern .               0       50%     1440
#refresh_pattern -i \.jpg$       1440    50%     2880      ignore-reload
#refresh_pattern -i \.png$       1440    50%     2880      ignore-reload
#refresh_pattern -i \.bmp$       1440    50%     2880      ignore-reload
#refresh_pattern -i \.gif$       1440    50%     2880      ignore-reload
#refresh_pattern -i \.jpeg$      1440    50%     2880      ignore-reload
#refresh_pattern -i \.swf$       1440    50%     2880      ignore-reload
#refresh_pattern -i \.js$        1440    50%     2880      ignore-reload
#refresh_pattern -i \.css$       1440    50%     2880      ignore-reload
refresh_pattern -i \.zip$       1440    50%     2880      ignore-reload

quick_abort_min -1 KB
quick_abort_max 32 KB
quick_abort_pct 95

# error page
#error_map http://www.ccc.net/error/404.html 403
#deny_info http://www.ccc.net/aaa.html ccc_Domain

# timeout
peer_connect_timeout 20 seconds
connect_timeout 20 seconds
#connect_timeout 1 minute
#negative_ttl 0 minutes
read_timeout 60 seconds
#read_timeout 15 minutes
request_timeout 20 seconds
#request_timeout 30 minutes
pconn_timeout 20 seconds
#pconn_timeout 1 minutes
#collapsed_forwarding on
#persistent_request_timeout 20 minute
#persistent_request_timeout 1 minutes
##client_lifetime 1 day
#client_lifetime 2 minutes
#shutdown_lifetime 30 seconds
shutdown_lifetime 5 seconds
strip_query_terms off

# snmp
#snmp_port 3401
#acl snmppublic snmp_community show
#snmp_access allow snmppublic localhost
#snmp_access deny all
icp_port 0

# logfile
emulate_httpd_log on
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
#access_log none
#access_log /log/squid-log/access.log combined
#cache_store_log /log/squid-log/store.log
cache_store_log /dev/null
cache_log /log/squid-log/cache.log
logfile_rotate 12

# MISCELLANEOUS
store_objects_per_bucket 15
client_db off

Squid配置详解

注: 这个参考文档是以ubuntu系统为基准的

安装

从源中安装源中自带稳定版本,执行下面的命令进行安装
sudo apt-get install squid squid-common源码编译安装当然你也可以到下面的官方网站下载最新的版本进行编译安装:
http://www.squid-cache.org/其中STABLE稳定版、DEVEL版通常是提供给开发人员测试程序的,假定下载了最新 的稳定版squid-2.5.STABLE2.tar.gz,用以下命令解开压缩包:
tar xvfz squid-2.5.STABLE.tar.gz用bz2方式压缩的包可能体积更小,相应的命令是:
tar xvfj squid-2.5.STABLE.tar.bz2 然后,进入相应目录对源代码进行配置和编译,命令如下:
cd squid-2.5.STABLE2配置命令configure有很多选项,如果不清楚可先用“-help”查看。通常情况下,用到的选项有以下几个:
--prefix=/web/squid指定Squid的安装位置,如果只指定这一选项,那么该目录下会有bin、sbin、man、conf等目录,而主要的配置文件此时在conf子目录中。为便于管理,最好用参数--sysconfdir=/etc把这个文件位置配置为/etc。
--enable-storeio=ufs,null使用的文件系统通常是默认的ufs,不过如果想要做一个不缓存任何文件的代理服 务器,就需要加上null文件系统。
--enable-arp-acl这样可以在规则设置中直接通过客户端的MAC地址进行管理,防止客户使用IP欺骗。
--enable-err-languages="Simplify_Chinese"--enable-default-err-languages="Simplify_Chinese"上面两个选项告诉Squid编入并使用简体中文错误信息。
--enable-linux-netfilter允许使用Linux的透明代理功能。
--enable-underscore允许解析的URL中出现下划线,因为默认情况下Squid会认为带下划线的URL是 非法的,并拒绝访问该地址。 整个配置编译过程如下:
./configure --prefix=/var/squid --sysconfdir=/etc --enable-arp-acl --enable-linux-netfilter --enable-pthreads --enable-err-language="Simplify_Chinese" --enable-storeio=ufs,null --enable-default-err-language="Simplify_Chinese" --enable-auth="basic" --enable-baisc-auth-helpers="NCSA" --enable-underscore 其中一些选项有特殊作用,将在下面介绍它们。 最后执行下面两条命令,将源代码编译为可执行文件,并拷贝到指定位置。
makesudo make install基本配置 安装完成后,接下来要对Squid的运行进行配置(不是前面安装时的配置)。所有项目都在squid.conf中完成。Squid自带的squid.conf包括非常详尽的说明,相当于一篇用户手册,对配置有任何疑问都可以参照解决。
在这个例子中,代理服务器同时也是网关,内部网络接口eth0的IP地址为192.168.0.1,外部网络接eth1的IP地址为202.103.x.x。下面是一个基本的代理所需要配置选项:
http_port 192.168.0.1:3128默认端口是3128,当然也可以是任何其它端口,只要不与其它服务发生冲突即可。为了安全起见,在前面加上IP地址,Squid就不会监听外部的网络接口。 下面的配置选项是服务器管理者的电子邮件,当错误发生时,该地址会显示在错误页面上,便于用户联系:
cache_mgr [email protected]以下这些参数告诉Squid缓存的文件系统、位置和缓存策略:
cache_dir ufs /var/squid cache_mem 32MB cache_swap_low 90 cache_swap_high 95 在这里,Squid会将/var/squid目录作为保存缓存数据的目录,每次处理的缓存大小是32兆字节,当缓存空间使用达到95%时,新的内容将 取代旧的而不直接添加到目录中,直到空间又下降到90%才停止这一活动。
如果不想Squid缓存任何文件,如某些存储空间有限的专有系统,可以使用 null文件系统(这样不需要那些缓存策略):
cache_dir null /tmp下面的几个关于缓存的策略配置中,较主要的是第一行,即用户的访问记录,可以通过分析它来了解所有用户访问的详尽地址:
cache_access_log /var/squid/access.log cache_log /var/squid/cache.log cache_store_log /var/squid/store.log 下面这行配置是在较新版本中出现的参数,告诉Squid在错误页面中显示的服务器名称:
visible_hostname No1.proxy以下配置告诉Squid如何处理用户,对每个请求的IP地址作为单独地址处理:
client_netmask 255.255.255.255如果是普通代理服务器,以上的配置已经足够。但是很多Squid都被用来做透明代理。
所谓透明代理,就是客户端不知道有代理服务器的存在,当然也不需要进行任何与代理有关的设置,从而大大方便了系统管理员。相关的选项有以下几个:
httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_user_host_header on 在Linux上,可以用iptables/ipchains直接将对Web端口80的请求直接转发到Squid端口3128,由Squid接手,而用户浏览器仍然认为它访问的是对方的80端口。例如以下这条命令:
iptables -t nat -A PREROUTING -s 192.168.0.200/32 -p tcp --dport 80 -j REDIRECT 3128 就是将192.168.0.200的所有针对80端口的访问重定向到3128端口。
所有设置完成后,关键且重要的任务是访问控制。Squid支持的管理方式很多,使用起来也非常简单(这也是有人宁愿使用不做任何缓存的Squid,也 不愿意单独使用iptables的原因)。
Squid可以通过IP地址、主机名、MAC地址、用户/密码认证等识别用户,也可以通过域名、域后缀、文件类 型、IP地址、端口、URL匹配等控制用户的访问,还可以使用时间区间对用户进行管理,所以访问控制是Squid配置中的重点。
Squid用ACL (Access Control List,访问控制列表)对访问类型进行划分,用http_access deny 或allow进行控制。根据需求首先定义两组用户advance和normal,还有代表所有未指明的用户组all及不允许上网的baduser,配置代 码如下:
acl advance 192.168.0.2-192.168.0.10/32 acl normal src 192.168.0.11-192.168.0.200/32 acl baduser src 192.168.0.100/32 acl baddst dst www.soocol.com acl all src 0.0.0.0/0 http_access deny baduser http_access allow advance http_access allow normal 可以看出,ACL的基本格式如下: acl 列表名称 控制方式 控制目标 比如acl all src 0.0.0.0/0,其名称是all,控制方式是src源IP地址,控制目标是0.0.0.0/0的IP地址,即所有未定义的用户。出于安全考虑,总是在最后禁止这个列表。 下面这个列表代表高级用户,包括IP地址从192.168.0.2到192.168.0.10的所有计算机:
acl advance 192.168.0.2-192.168.0.20/32下面这个baduser列表只包含一台计算机,其IP地址是192.168.0.100:
acl baduser 192.168.0.100/32 ACL写完后,接下来要对它们分别进行管理,代码如下:
http_access deny baduser http_access allow advance http_access allow normal 上面几行代码告诉Squid不允许baduser组访问Internet,但advance、normal组允许(此时还没有指定详细的权限)。由于 Squid是按照顺序读取规则,会首先禁止baduser,然后允许normal。如果将两条规则顺序颠倒,由于baduser在normal范围中, Squid先允许了所有的normal,那么再禁止baduser就不会起作用。
特别要注意的是,Squid将使用allow-deny-allow-deny……这样的顺序套用规则。例如,当一个用户访问代理服务器时, Squid会顺序测试Squid中定义的所有规则列表,当所有规则都不匹配时,Squid会使用与最后一条相反的规则。
就像上面这个例子,假设有一个用户 的IP地址是192.168.0.201,他试图通过这台代理服务器访问Internet,会发生什么情况呢?我们会发现,他能够正常访问,因为 Squid找遍所有访问列表也没有和192.168.0.201有关的定义,便开始应用规则,而最后一条是deny,那么Squid默认的下一条处理规则 是allow,所以192.168.0.201反而能够访问Internet了,这显然不是我们希望的。所以在所有squid.conf中,最后一条规则 永远是http_access deny all,而all就是前面定义的“src 0.0.0.0”。
高级控制 前面说过,Squid的控制功能非常强大,只要理解Squid的行为方式,基本上就能够满足所有的控制要求。下面就一步一步来了解Squid是如何进行控制管理的。
通过IP地址来识别用户很不可靠,比IP地址更好的是网卡的MAC物理地址。要在Squid中使用MAC地址识别,必须在编译时加上“--enable-arp-acl”选项,然后可以通过以下的语句来识别用户:
acl advance arp 00:01:02:1f:2c:3e 00:01:02:3c:1a:8b ...它直接使用用户的MAC地址,而MAC地址一般是不易修改的,即使有普通用户将自己的IP地址改为高级用户也无法通过,所以这种方式比IP地址可靠得多。
假如不想让用户访问某个网站应该怎么做呢?可以分为两种情况:一种是不允许访问某个站点的某个主机,比如ok的主机是ok.sina.com.cn,而其它的新浪资源却是允许访问的,那么ACL可以这样写:
acl sinapage dstdomain ok.sina.com.cn ... ... http_access deny ok ... ... 由此可以看到,除了ok,其它如http://www.sina.com.cn、news.sina.c...��常访问。
另一种情况是整个网站都不许访问,那么只需要写出这个网站共有的域名即可,配置如下:
acl qq dstdomain .tcccent.com.cn注意tcccent前面的“.”,正是它指出以此域名结尾的所有主机都不可访问,否则就只有tcccent.com.cn这一台主机不能访问。
如果想禁止对某个IP地址的访问,如202.118.2.182,可以用dst来控制,代码如下:
acl badaddr dst 202.118.2.182当然,这个dst也可以是域名,由Squid查询DNS服务器将其转换为IP。
还有一种比较广泛的控制是文件类型。如果不希望普通用户通过代理服务器下载MP3、AVI等文件,完全可以对他们进行限制,代码如下:
acl mmxfile urlpath_regex \.mp3$ \.avi$ \.exe$ http_access deny mmxfile 看到regex,很多读者应该心领神会,因为这条语句使用了标准的规则表达式(又叫正则表达式)。它将匹配所有以.mp3、.avi等结尾的URL请求,还可以用-i参数忽略大小写,例如以下代码:
acl mmxfile urlpath_regex -i \.mp3$这样,无论是.mp3还是.MP3都会被拒绝。当然,-i参数适用于任何可能需要区分大小写的地方,如前面的域名控制。
如果想让普通用户只在上班时间可以上网,而且是每周的工作日,用Squid应当如何处理呢?看看下面的ACL定义:
acl worktime time MTWHF 8:30-12:00 14:00-18:00 http_access deny !worktime 首先定义允许上网的时间是每周工作日(星期一至星期五)的上午和下午的固定时段,然后用http_access 定义所有不在这个时间段内的请求都是不允许的。
或者为了保证高级用户的带宽,希望每个用户的并发连接不能太多,以免影响他人,也可以通过Squid控制,代码如下:
acl conncount maxconn 3 http_access deny conncount normal http_access allow normal这样,普通用户在某个固定时刻只能同时发起三个连接,从第四个开始,连接将被拒绝。
总之,Squid的ACL配置非常灵活、强大,更多的控制方式可以参考squid.conf.default。
认证 用户/密码认证为Squid管理提供了更多便利,最常用的认证方式是NCSA。从Squid 2.5版本开始,NCSA认证包含在了basic中,而非以前单独的认证模块。下面来看看实现认证的具体操作。
首先在编译时配置选项应包括以下配置:
--enable-auth="basic" --enable-basic-auth-helpers="NCSA" “make install”以后,需要将“helpers/basic_auth/NCSA/ncsa_auth”拷贝到用户可执行目录中,如/usr/bin(如 果在该目录中找不到这个执行文件,在编译时请使用make all而不是make,或者直接在该目录中执行make),然后需要借助Apache的密码管理程序htpasswd来生成用户名/密码对应的文件,就像 下面这行代码:
htpasswd -c /var/squid/etc/password guest在输入两遍guest用户的密码后,一个guest用户就生成了。如果以后需要添加用户,把上面的命令去掉-c参数再运行即可。
Squid 2.5在认证处理上有了较大的改变,这里就只讨论2.5版本的处理方法,2.4及以下版本请参考squid.conf.default。在2.5版的squid.conf中,包括以下几个相关选项:
该选项指出了认证方式(basic)、需要的程序(ncsa_auth)和对应的密码文件(password)
auth_param basic program /usr/bin/ncsa_auth /var/squid/etc/password 指定认证程序的进程数
auth_param basic children 5浏览器显示输入用户/密码对话框时的领域内容
auth_param basic realm My Proxy Caching Domain基本的认证有效时间
auth_param basic credentialsttl 2 hours普通用户需要通过认证才能访问Internet
acl normal proxy_auth REQUIRED http_access allow normal通过以上的配置即可完成认证工作。有的读者可能要问:认证只针对普通用户,而高级用户是直接上网的,该怎么处理呢?其实,这两种用户是可以共存的。
如 前所述,Squid是顺序处理http_access的,所以在http_access处理过程中,如果先处理normal用户,那么当前用户无论是否属 于高级用户,都会被要求进行认证;相反如果先处理高级用户,剩下的就只有需要认证的普通用户了。例如以下配置代码:
... http_access allow normal (需要认证) http_access allow advance (不需要认证) ... 不管是否为noauth用户,都要求进行用户名/密码验证。正确的方法是将二者位置交换,代码如下:
... http_access allow advance http_access allow normal ... 这时,高级用户不会受到任何影响。
总结下面把整个squid.conf总结一下:
服务器配置http_port 192.168.0.1:3128 cache_mgr [email protected] cache_dir null /tmp cache_access_log /var/squid/access.log cache_log /var/squid/cache.log cache_store_log /var/squid/store.log visible_hostname No1.proxy client_mask 255.255.255.255 httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_user_host_header on用户分类acl advance arp 00:01:02:1f:2c:3e 00:01:02:3c:1a:8b ... acl normal proxy_auth REQUIED acl all src 0.0.0.0行为分类acl mmxfile urlpath_regex \.mp3$ \.avi$ \.exe$ acl conncount maxconn 3 acl worktime time MTWHF 8:30-12:00 14:00-18:00 acl sinapage dstdomain ok.sina.com.cn acl qq dstdomain .tcccent.com.cn处理http_access allow advance http_access deny conncount normal http_access deny !worktime http_access deny mmxfile http_access deny sinapage http_access deny qq http_access allow normal配置后的状况是,advance组可以不受任何限制地访问Internet,而normal组则只能在工作时间上网,而且不能下载多媒体文件,不能访问某些特定的站点,而且发送请求不能超过3个。
通过本文的介绍,它可以了解Squid的基本能力。当然,它的能力远不止此,可以建立强大的代理服务器阵列,可以帮助本地的Web服务器提高性能,可以提高本地网络的安全性等。要想发挥它的功效,还需要进一步控制。

squid 关于内存相关参数的说明

cache_mem  10240 MB  squid使用的其它内存上限,用于传输中的对象/热对象/非缓存对象(有点像linux的硬盘缓存,他们都存成4kb的块,这样可以提高传输速度),默认8MB,传输中的对象优先级最高。
注意:这个值要参考硬盘缓存所使用的内存和总内存量确定,设定大,则缓存的热内容多,但硬盘缓存的内容就少了。(估算一下最热内容占多大空间再决定)
maximum_object_size_in_memory  16  KB  对象的最大尺寸,超过不会被放入内存,默认8KB,根据网站网页一般的尺寸设置大小,最好是4kb的倍数
memory_replacement_policy  lru  内存替换策略,默认LRU,不用改
memory_pools  on  squid预先分配一定的内存用于cache,以提高效率,默认on;如果os内存管理很高效,可以off
memory_pools_limit  5  MB  squid在memory_pools中保存的预分配(未使用的)内存的上限,当pools开启时有效,0表示不限制大小,最好设一个的值,大些,以保证内存效率,实际不一定会用到这个值,默认5MB。这个值可以设置为64-128MB,squid会根据需求占用之。

如果在服务器只单纯用于squid服务时,可以关闭memory_pools 选项,让squid自动决定分配多少内存:
memory_pools off
memory_pools_limit none
如果不是专门的服务器,就要打开memory_pools 选项,适当的设置
memory_pools on
memory_pools_limit 1024M

【求助】用squid 2.7做透明代理iptables规则问题

系统环境:CentOS 5.5今天刚编译了新的内核是2.36.2  
                 squid 2.7做的透明代理服务器
          内网网段:192.168.10.0/24
                  squid服务器地址:192.168.10.11 (端口是3128)
          网  关:192.168.10.1(也是CentOS 5.5)
遇到的问题:
           squid设置完成后需要在网关(192.168.10.1)上边设置转发规则 将内网192.168.10.0/24所有访问80端口的数据包

重定向到squid服务器3128端口上,因为网关和squid不在同一台机器,我在用192.168.10.1上边添加

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128

添加后就将内网80端口数据重定向到了本地的3128端口,请问如何将80数据转发到192.168.10.11:3128端口上呢
我试了下iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 192.168.10.11:3128这条规则是将80端口的数据转发到了本地192端口上
。。很郁闷所以在此求教。

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.10.11:3128

这两条规则效果一样吗,除了在网关上设置将内网所有80端口的数据重定向到代理服务器3128端口外,还需要设置其他规则吗,还需要在192.168.10.11这台代理服务器上设置哪些规则吗,谢谢.

ps:研究了一周左右了,CDN网络加速已经实验成功,透明代理这里防火墙规则设置不过去,郁闷的很,在网上查了很多资料,越看越晕,到最后自己都糊涂了。。。能给出具体规则最好 呵呵谢谢大家 QQ:861112650

squid-2.6 在CentOS上源码安装

下载并解压缩最新的squid-2.6  
wget  http://mylinux.5d6d.com/userdirs ... 2.6.STABLE20.tar.gz
ulimit -HSn 65535
编译参数
./configure --prefix=/usr/local/squid \
--disable-dependency-tracking \
--enable-dlmalloc \
--enable-gnuregex \
--disable-carp \
--enable-async-io=240 \
--with-pthreads \
--enable-storeio=ufs,aufs,diskd,null \
--disable-wccp \
--disable-wccpv2 \
--enable-kill-parent-hack \
--enable-cachemgr-hostname=localhost \
--enable-default-err-language=Simplify_Chinese \
--with-build-environment=POSIX_V6_ILP32_OFFBIG \
--with-maxfd=65535 \
--with-aio \
--disable-poll \
--enable-epoll \
--enable-linux-netfilter \
--enable-large-cache-files \
--disable-ident-lookups \
--enable-default-hostsfile=/etc/hosts \
--with-dl \
--with-large-files \
--enable-removal-policies=heap,lru \
--enable-delay-pools \
--enable-snmp \
--disable-internal-dns

make && make install

squid.conf 中的refresh_pattern详解

这个东西是用来设置对象缓存时间的。
首先理解 refresh_pattern 语法: refresh_pattern [-i] regexp min percent max [options]
例如:
refresh_pattern \.(jpg|png|gif|mp3|xml|css|js)$ 1440    50%     28800    ignore-reload

-i 其实就是是否区分大小写,加上这个参数就是不区分。 regexp代表正则表达式,上例中表示以jpg|png|gif|mp3|xml|css|js 结尾的这些文件,当然这里的| 表示 或 的意思。
几个概念:
resource age =对象进入cache的时间-对象的last_modified,简单点理解就是从对象被缓存到对象被修改之间的时间
response age  =当前时间-对象进入cache的时间,简单理解就是对象已经被缓存了多久

min和max为时间,单位是分钟,上例中 1440就是1天,28800就是20天。

百分比,这个东西用来衡量一个文件的存活时间。存活时间= resource age * 百分比。

[options]  
如果希望页面一进入cache就不删除,直到被主动purge掉为止,可以加上ignore-reload选项.  一般情况可以使用 reload-into-ims

最后说说,如何判断一个文件是否过期:
1.  首先计算出response age
2.  当response age <= max时,对象不过期,而>max时就过期了
3.  当response age介于两者之间时,就需要看 存活期了,当存活期 > response age 时则过期,否则不过期。

过期了的话,squid并不会删除对象,当有请求来访问该文件时,则squid会到前端的web上去读取新的文件,但是squid还是会把当前的文件和web上的文件做对比,如果改了则重新拉取过来缓存,否则不拉取,直接更改resource age 。

squid优化及配置参数

Squid 在高负载下,需要大量的内核资源。特别的,您需要给您的系统配置比正常情况更高的文档描述符和缓存。文档描述符的限制通常很恼人。您最好在开始编译squid 之前来增加这些限制的大小。 .

文档描述符是个简单的整数,用以标明每一个被进程所打开的文档和socket。第一个打开的文档是0,第二个是1,依此类推。Unix 操作系统通常给每个进程能打开的文档数量强加一个限制。更甚的是,unix 通常有一个系统级的限制。

因为squid 的工作方式,文档描述符的限制可能会极大的影响性能。当squid 用完任何的文档描述符后,他不能接收用户新的连接。也就是说,用完文档描述符导致拒绝服务。直到一部分当前请求完成,相应的文档和socket 被关闭,squid 不能接收新请求。当squid发现文档描述符短缺时,他会发布警告。

在运行./configure 之前,检查您的系统的文档描述符限制是否合适,能给您避免一些麻烦。大多数情况下,1024 个文档描述符足够了。很忙的cache可能需要4096或更多。在配置文档描述符限制时,我推荐配置系统级限制的数量为每个进程限制的2 倍。

通常在您的Unix shell 中能找到系统的文档描述符限制。任何的C shell 及其类似的shell有内建的limit 命令。更新的Bourne shell 及其类似的shell 有一条叫做ulimit 的命令。为了发现您的系统的文档描述符限制,试运行如下命令:
sh$ ulimit -n .

在Linux 上配置文档描述符有点复杂。在编译squid 之前,您必须编辑系统include 文档中的一个,然后执行一些shell 命令。请首先编辑/usr/include/bits/typesizes.h 文档,改变__FD_SETSIZE 的值:
#define _ _FD_SETSIZE 8192

下一步,使用这个命令增加内核文档描述符的限制:
# echo 8192 > /proc/sys/fs/file-max

最后,增加进程文档描述符的限制,在您即将编译squid 的同一个shell 里执行:
sh# ulimit -Hn 8192

该命令必须以root 运行,仅仅运行在bash shell。不必重启机器。

使用这个技术,您必须在每一次系统启动后执行上述echo 和ulimit 命令,或至少在squid 启动之前。假如您使用某个rc.d 脚本来启动squid,那是个放置这些命令的好地方。 .

临时端口是TCP/IP 栈分配给出去连接的本地端口。换句话说,当squid 发起一条连接到另一台服务器,内核给本地socket 分配一个端口号。这些本地端口号有特定的范围限制。

临时端口号的短缺对很忙的代理服务器(例如每秒数百个连接)来说,会较大的影响性能。这是因为一些TCP 连接在他们被关闭时进入TIME_WAIT 状态。当连接进入TIME_WATI 状态时,临时端口号不能被重用。

您能使用netstat 命令来显示有多少个连接进入这个状态:

% netstat -n | grep TIME_WAIT

在Linux 上,简单的写一对数字到下列指定文档:
# echo "1024 40000" > /proc/sys/net/ipv4/ip_local_port_range

不要忘记将这些命令加到您的系统启动脚本中,以使机器每一次重启后都生效。 ..

ls -l /usr/local/squid
total 5
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 bin
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 etc
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 libexec
drwxr-x--- 3 wessels wheel 512 Apr 28 20:43 man
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 sbin
drwxr-x--- 4 wessels wheel 512 Apr 28 20:42 share
drwxr-x--- 4 wessels wheel 512 Apr 28 20:43 var ..

.4.1 configure 选项

./configure 脚本有大量的不同选项,他们以-开始。当您敲入./configure --help 时,能看到选项的完整列表。一些选项对任何configure 脚本是通用的,更有一些是squid 专有的。下面是您可能用得到的标准选项:
--perfix =PREFIX

如前面描述的相同,这里配置安装目录。安装目录是任何可执行文档,日志,和配置文档的默认目录。在整本书中,$prefix 指您选择的安装目录。

--localstatedir =DIR
该选项允许您改变var 目录的安装位置。默认是$prefix/var,但也许您想改变他,以使squid 的磁盘缓存和日志文档被存储在别的地方。

--sysconfdir =DIR
该选项允许您改变etc 目录的位置。默认的是$prefix/etc。假如您想使用/usr 作为安装位置,您也许该配置--sysconfdir为/etc.

以下是squid 的专有./configure选项:

--enable-dlmalloc[=LIB]
在一些系统上,内建的内存分配机制(malloc)在使用squid 时表现不尽人意。使用--enable-dlmalloc 选项将squid 源代码包中的dlmalloc 包编译和链接进来。假如您的系统中已安装dlmalloc,您能使用=LIB 参数指定库的路径。请见http://g.oswego.edu/dl/html/malloc.html更多关于dlmalloc 的信息。 。

--enable-gnuregex
在访问控制列表和其他配置指令里,squid 使用正则表达式作为匹配机制。GNU 的正则表达式库包含在squid 的源代码包里;他能够在没有内建正则表达式的操作系统中使用。./configure脚本侦察您系统中的正则表达式库,假如必要,他能够激活使用GNU正则表达式。假如因为某些理由,您想强制使用GNU正则表达式,您能够将这个选项加到./configure命令后。

--enable-carp
Cache数组路由协议(CARP)用来转发丢失的cache到父cache的数组或cluster。在10.9章有更多关于CARP的细节。

--enable-async-io[=N_THREADS]
同步I/O 是squid 技术之一,用以提升存储性能。aufs 模块使用大量的线程来执行磁盘I/O 操作。该代码仅仅工作在linux 和solaris 系统中。=N_THREADS 参数改变squid 使用的线程数量。aufs 和同步I/O 在8.4 章中被讨论。

Squid 错误信息中显示时间问题

Squid的Error messages 默认的时间显示的GMT时间,而非本地时间,这个有时候看着很别扭。

  下面是修改方法,找到Squid的源文件src/errorpage.c 大概在60多行,

    {
ERR_SQUID_SIGNATURE,
     "\n<BR clear=\"all\">\n"
     "<HR noshade size=\"1px\">\n"
     "<ADDRESS>\n"
     "Generated %T by %h (%s)\n"
     "</ADDRESS>\n"
     "</BODY></HTML>\n"
    },

  把上面的“ "Generated %T by %h (%s)\n"” 修改为“ "Generated %t by %h (%s)\n"”即可。

即:把%T改为%t 。

php 中ming的编译

1、下载  ming-0.4.0.rc1.tar.bz2  
wget http://mylinux.5d6d.com/userdirs ... ng-0.4.0.rc1.tar.gz
2、 tar jxvf ming-0.4.0.rc1.tar.bz2
3、cd ming-0.4.0.rc1 ; ./configure --prefix=/usr/local/ming ; make && make install
4、cp -r php_ext/*  /usr/local/src/php-5.2.8/ext/ming
5、cd /usr/local/php-5.2.8/
6、./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysql-sock=/tmp --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt=/usr/local/libmcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --enable-zend-multibyte --disable-ipv6 --enable-fastcgi --enable-fpm  --with-ming=/usr/local/ming
7、make && make install