Squid配置管理指南(精华)
一. Web Cache技术简介

       WWW技术是当今Internet上发展最快,使用最广泛的技术; WWW应用也早已取代E-mail成为Internet上数据流量最大的应用。Internet 的飞速发展,对网络的带宽建设提出更高要求。如何在现有带宽的条件下,更有效的使用WWW资源,是Internet世界关注的焦点之一。在此种迫切需求下,Web Cache技术应运而生。
       Web Cache的作用和个人电脑上网页浏览器所带的缓存一样,主要是对网络信息进行缓存。当用户第一次向一个网页发出访问请求,网页从远端服务器传送给用户时,该网页内容被存在缓存服务器中。第二个用户在对同一个网页发出访问请求时,就可以直接从缓存服务器中得到网页,而不必连接到远端服务器。这样对那些访问频繁的网页,访问速度会大大提高。而这一切对用户都是透明的。

Cache Hit:当用户发起请求时,Cache服务器首先会在快取缓冲区内寻找该数据。如果欲查询的数据恰好已存在于缓冲区内(这样的情况我们称之为cache hit ),就直接从内存读出数据。
Cache Miss:当用户发起请求时,Cache服务器首先会在快取缓冲区内寻找该数据。如果欲查询的数据恰好已存在于缓冲区内(这样的情况我们称之为cache Miss ),那么Cache服务器需要到远端服
务器进行请求,然后重新进行缓存。
Uncachable:不允许Cache服务器对该数据进行缓存。
Cache Validation:保证Cache服务器不提供给用户过期信息的一种机制。

二. Squid安装时硬件需求

       相对于其它系统而言,Web Cache系统更依赖于硬件资源。虽然Web Cache系统的高性能关键来自整个软硬件系统的高性能,但下列因素对Web Cache系统性能的影响非常明显,按照重要性按由高到低排列为:
   磁盘随机访问时间
   系统内存的容量
       磁盘的持续吞吐量
  
CPU能力
上述任何一个要素的不足,都将明显影响缓存系统性能。为了保证系统能够稳定高效的运行,系统冗余是必不可少的。以便于在出现硬件故障情况下,有预先准备的替换部件。如果你的Web Cache服务器非常重要,应该有一个(正在运行的)安装了操作系统和squid的冗余机器,以便于可以进行瞬时切换。下面我们来详细描述如何确定Web Cache服务器所需要的硬件资源:
硬盘
Web Cache服务器需要使用一个随机访问速度快且高吞吐量的硬盘。但是如果我们设定很少的Web缓存数据,那么它即使是世上最快的硬盘也没什么用处。为了提高缓存的效率,硬盘需要保存大量的下载数据。在硬盘的选择上,硬盘的查找时间(Seek time)是一个很关键的性能参数。我们可以在硬盘的说明文档中查看该参数定义。这个数值越小越好:它是磁头从一个随机磁道移到另一个磁道的平均时间(以毫秒为单位)。 只有一个硬盘的缓存处理一次请求至少访问一次硬盘(忽略硬盘的RAM缓冲和结点更新次数). 如果只有一个硬盘, 我们可以通过下面的公式来计算一秒内硬盘查找次数(由此而得一秒内的请求数):
       每秒请求数 = 1000/查找时间
       当我们在Web Cache服务器中使用多个硬盘时,那么操作系统会在不同的硬盘间交叉写盘,因此如果你在Web Cache服务器中使用多个硬盘,那么每个硬盘的每秒查找次数会低一些。 几乎所有的操作系统,当增加硬盘后,随机查找时间呈半线性方式增加. 如果你在等式中增加磁盘的数量,每秒请求数会更接近! 同时为了简化,我们假定你用的硬盘都有相同的查找时间,从而公式变为:
每秒请求数的理论值 = 1000/(查找时间)/(硬盘数)
如果我们有3个硬盘 - 它们的查找时间都是12ms.,因而理论上的请求处理速度,
每秒请求次数 = 1000/(12/3) = 1000/4 = 250 次/秒
另外由于目前IDE技术的发展使得IDE硬盘的查找时间与SCSI硬盘的非常接近,所以(带有DMA兼容的IDE控制器)数据传输速度不会降低整个机器的运行速度。在确定了使用的硬盘类型之后,我们需要确定为Web Cache服务器分配多大的硬盘空间。当决定分配给缓存的硬盘空间数量时,应该确定每天经过缓存的数据的大概容量。如果你不能确定这个数值,那么你可以使用平均传输速度为基础来计算该数值。一个 10Mb/s 的线缆每秒大约传输1,250,000字节. 如果所有客户端都来访问这个缓存, 硬盘将以每秒1250k的速度被使用,如果全速运转一天(24小时),你大约传输了36 G字节. 那么我们则要分配给Web Cache服务器一个36G的空间。
使用RAID系统来建造缓存系统. 这可以显著地增加数据的可用性,但一个RAID-5系统严重地降低硬盘的吞吐量。如果你非常关心系统的正常运行时间,选择一个RAID系统确实不错. 但是,由于缓存中存储的数据并不重要,你可手工清除这些数据,重新格式化或替换磁盘。

RAM 需求

       Squid在内存中维护着一个对象对列。由于Squid需要检查一个对象是否已经缓存,所以这个表的快速查找非常重要。当由于系统内存不足,这个表的一部分被放在交换分区中时,squid的性能就会显著下降。这时因为squid是一个很大的进程,所以对它做进程切换将严重影响其性能。并且由于操作系统在切换进程时,squid会被放入'睡眠任务'队列中, 它将暂时不能处理已经建立的请求连接。
       每一个硬盘上的Cache对象,其索引项大约占用75个字节的内存。据统计Web Service中每个对象的平均大小约为3K, 因此如果你有一个1G的硬盘空间,你可以存放大约350000个Web Service对象。而一个Web Service对象需要占用75字节RAM, 80 000对象大约需要30M内存。如果你有8G硬盘空间,则需要250M内存来建立对象索引。但是这些内存需求并不包括操作系统、Squid进程以及系统其他使用的内存,明白这一点很重要。

硬盘持续吞吐量
Squid倾向于取小的数据块,所以吞吐量的重要性不比随机访问时间。通常,能快速查找的硬盘一般具备很大的吞吐量,而硬盘越多(在现在,即使是IDE硬盘) 能传输越多的数据,从而超过客户端所能从缓存下载数据的速度。

CPU 能力
一般说来,Squid不是一个多CPU敏感程序,在启动时,Squid会使用大量的CPU资源来查找缓存里有哪些内容,一个低速的CPU会降低Squid刚启动后几分钟内的缓存访问速度。一个多处理器的机器通常不会明显地增加访问速度: 虽然一部分Squid代码可以跑多线程,但是这个代码片段也不是CPU密集的。
由上面的分析可以了解更多的内存或更多的硬盘会更大幅度的提升Squid的性能。

三. Squid安装前的系统优化。

Squid的系统优化包括Squid运行操作系统的选择和操作系统性能参数的调整两个部分:
选择操作系统
Squid支持大部分的类Unix操作系统,这些操作系统列表可以在Squid的官方网站上看到。不过据Squid的作者推荐,一般采用FreeBSD和Linux系统。
系统性能参数调整

1. FD调整
Linux:
a) 打开/usr/include/bits/typesize.h ,修改#define __FD_SETSIZE为你想要的数值。
b) echo 8192 > /proc/sys/fs/file-max
c) Ulimit –Hn 8192
d) 然后再开始编译Squid。(这些参数都是暂时生效的,机器重新启动后,这些参数会丢失,你需要把这些写在squid的启动脚本中。
FreeBSD:
a) 修改Kernel的配置文件,将Maxfile改为”options    MAXFILES=8192”
b) 重新编译内核,使用新的内核启动。

2. 本地端口调整
Linux:
a)   echo "minport maxport" > /proc/sys/net/ipv4/ip_local_port_range
b) 这个值同样是暂时生效的,机器重新启动后,这些参数会丢失,所以也需要将这些参数写入Squid的启动脚本里面。
FreeBSD:
a) sysctl -w net.inet.ip.portrange.last=maxport

四. Squid的补丁管理。

Squid目前的版本是2.5.STABLE5,但是随着Squid的使用,大家不断的对Squid进行修改,不断的发行补丁,而这些补丁往往都没有集成到用户下载的软件包中,所以我们需要在编译之前,首先对
现有的Squid打补丁,具体步骤为:
1. 下载所需补丁。
2. 进入Squid的源代码目录。
3. 运行patch –p1 < Squid补丁存放路径。
在完成系统调整、给Squid进行补丁安装后,我们就可以开始编译安装了。

五. Squid Configure参数含义。

在正式开始编译、运行Squid之前,我们需要对Squid进行一系列的配置。下面我们分别解释其参数的具体含义:
   --cache-file=FILE       把运行configure时的输出信息放置到指定文件中。
   --help                输出帮助信息
   --no-create              只是检测系统是否可以安装Squid,而不生成任何文件。
   --quiet, --silent       不显示运行configure时输出信息
   --site-file=FILE       use FILE as the site file
   --version             显示生成configure脚本的autoconf版本号
Directory and file names:
   --prefix=PREFIX       将Squid的安装文件放置到此目录下
   --bindir=DIR          将Squid安装目录的bin目录放置在此目录下
   --sbindir=DIR           将Squid安装目录的sbin目录放置在此目录下
   --libexecdir=DIR       将Squid安装目录的libexec目录放置在此目录下
   --datadir=DIR           将Squid安装目录的share目录放置在此目录下
   --sysconfdir=DIR        将Squid安装目录的etc目录放置在此目录下
   --localstatedir=DIR     将Squid安装目录的var目录放置在此目录下
   --libdir=DIR          将Squid安装目录的lib目录放置在此目录下
   --includedir=DIR        C header files in DIR [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
   --infodir=DIR           info documentation in DIR [PREFIX/info]
   --mandir=DIR          将Squid安装目录的man目录放置在此目录下
--enable and --with options recognized:
   --enable-dlmalloc[=LIB] 使用新的malloc函数
   --enable-gnuregex    支持GNUregex
   --enable-xmalloc-statistics 支持在统计页面中显示malloc统计
   --enable-carp           支持CARP协议
   --with-aufs-threads=N_THREADS 设定aufs所使用的线程数
   --with-pthreads       支持POSIX Threads
   --with-aio              使用POSIX AIO
   --with-dl             使用动态链接
   --enable-storeio="list of modules" 选择支持的存储种类
   --enable-delay-pools 支持带宽管理功能
   --disable-wccp       不支持WCCP协议
   --enable-kill-parent-hack   在关闭child进程时同时关闭父进程。
   --enable-snmp           支持SNMP监控
   --enable-cachemgr-hostname[=hostname] 设定cachemgr.cgi缺省名称
   --enable-arp-acl        支持ARP ACL功能
   --enable-htcp           支持HTCP协议
   --enable-ssl          支持SSL协议。
   --with-openssl[=prefix] 设定Openssl的开发库路径。
   --enable-cache-digests   使用缓存摘要
   --enable-default-err-language=lang   设定缺省的错误语言
   --enable-err-languages="lang1 lang2.." 选择支持的语言种类
   --with-coss-membuf-size 设定COSS membuf 大小 (缺省为1048576 bytes)
   --enable-poll           使用poll()代替select()。
   --disable-poll       不使用poll
   --disable-http-violations 不支持HTTP标准不兼容的命令
   --enable-linux-netfilter   支持透明代理
   --disable-internal-dns   禁止Squid进行DNS解析,由外部程序”dnsserver”来完成。
   --enable-truncate       使用truncate()代替unlink()。
   --disable-hostname-checks 支持在主机名中使用特殊字符。
   --enable-underscores 支持带“_”的域名。
   --enable-auth="list of auth scheme modules"   配置支持的认证模块种类

六. Squid命令参数含义。

下面介绍squid的运行命令:
Usage: squid [-dhsvzCDFNRVYX] [-f config-file] [-[au] port] [-k signal]
   -a port 指定Squid使用的Http端口号.
   -d level   设定Squid调试信息等级。
   -f file 指定Squid所使用的配置文件
   -h    输出帮助信息
   -k reconfigure 重新载入新的配置文件而不重新启动Squid进程。
Rotate   进行日志回滚
Shutdown 等待所有请求完成后再停止Squid。
Interrupt   拒绝Squid接受新的请求,立即结束Squid。
Check   检查Squid当前的运行状态
Kill 直接停止Squid。
Debug 调试模式
Parse 检查配置文件是否正确
   -s        将信息输出到syslog中.
   -u port 设定ICP端口,0表示禁止使用ICP.
   -v        打印Squid版本号
   -z        创建Squid Swap目录。
   -C        不捕捉错误信号.
   -D        禁止进行初始化DNS解析
   -F        在Store没有建立之前不接受任何请求。
   -N        不作为Damon形式运行。
   -V        设定主机的Http加速模式为Virtual,直接设定http_accel_host值。
   -X        输出完整的调试信息
   -Y        在快速reload时只输出UDP_HIT或 UDP_MISS_NOFETCH信息。

七. Squid Conf配置参数含义。

Squid配置文件中的参数主要分为以下几类:
1. 通用参数。
2. 访问控制参数。
3. Cache相关参数。
4. 服务器加速模式相关参数。
5. ICP参数。
6. 日志文件相关参数。
7. Squid监控相关参数

一. 通用参数
Http_port:Squid缺省监听端口,可以设定多个监听端口。
Icp_port:发送和接收ICP的端口号。
Htcp_port:发送和接收HTCP端口号。
Mcast_groups:接收ICP多播地址范围。
Visible_hostname:设定Squid的本地主机名。(必须设定)
cache_effective_user:Squid进程所使用的用户。
cache_effective_group:Squid进程所使用的组。

二. 访问控制参数。

访问控制条目语法为:
acl name type value1 value2 ……
其中acl为关键字,name是用户定义的名称,type是表明acl的类型,value1 and value2是具体值。
在大多数情况下,下面两种形式是等效的:
Acl http_ports port 80 8000 8080与
Acl http_ports port 80
Acl http_ports port 8000
Acl http_ports port 8080是等效的。

Acl主要的类型包括:
1. IP地址:src, dst, myip。
2. 域名:srcdomain, dstdomain,和the cache_host_domain
3. 用户名:ident, proxy_auth
4. 正则表达式:srcdom_regex, dstdom_regex, url_regex, urlpath_regex, browser, referer_regex, ident_regex, proxy_auth_regex, req_mime_type, rep_mime_type。
5. 端口号:port, myport。
6. 其他:method, proto, time, snmp_community, maxconn, arp,
在Squid-2.5以后,引入了一种新的模式――ACL支持使用外部应用程序,这使得用户可以更加自主的定义ACL列表,并进行相关的操作。
另外,如果用户所定义的ACL元素过多,Squid还支持将这些数值写入一个文件,并且在acl中直接指定该文件:例如:如下的acl列表就可以修改为
Acl test port 80 90 8080 8000 8100 21 23 445
Acl test port “/usr/local/squid/etc/portlist”
其中portlist文件格式如下:
80
90
8080
……
访问控制规则定义语法为:
(Rule) deny|allow (ACL 名称)

三. Cache相关参数。

cache_mem:设定Squid所使用的内存数量。
maximum_object_size:设定Squid可以缓存的Object最大大小。
minimum_object_size:设定Squid可以缓存的Object最小大小。
maximum_object_size_in_memory:设定Squid内存中可以缓存的Object最大大小。
cache_replacement_policy:Cache中的Object更新策略,包括(lru、heap GDSF、heap LFUDA和heap LFU)
memory_replacement_policy:代理服务器内存中Object更新策略,类型同上。
cache_dir:设定Cache的存储路径以及存储类型。
Ufs:传统的UNIX文件系统存取方式。
Aufs:使用多线程技术进行文件存取。
Diskd:使用额外的独立进程进行文件存取。
Coss:最新开发的专为Squid优化的文件系统,还处于试验阶段。
下面是这几种文件系统性能的比较:
Table D-1. Linux benchmarking results
Storage scheme Filesystem Mount options Throughput (xact/sec) Response time (sec) Hit ratio (%)
coss     326.3 1.59 53.9
aufs(1) ext2fs noatime 168.5 1.45 56.3
diskd(1) ext2fs noatime 149.4 1.53 56.1
aufs(2) ext2fs 110.0 1.46 55.6
ufs(1) ext2fs 54.9 1.52 55.6
ufs(2) ext3fs 48.4 1.49 56.8
ufs(3) xfs 40.7 1.54 55.3
ufs(4) reiserfs notail, noatime 29.7 1.55 55.0
ufs(5) reiserfs 21.4 1.55 55.1
request_header_max_size:用户请求的HTTP头大小。
refresh_pattern:用户可以单独指定某种文件的更新策略。

四. 服务器加速模式相关参数。

httpd_accel_host:指定目标主机IP地址。
httpd_accel_port:指定目标主机Web服务IP地址。
httpd_accel_uses_host_header:是否使用用户请求中的header。
httpd_accel_single_host:是否将所有用户请求都转发到目标主机。
httpd_accel_with_proxy:是否在提供加速模式时同时提供代理功能。

五. Cache服务器互联相关参数

这些选项是在使用Squid建立大型的缓存服务器集群时使用的。
Cache_peer:设定该缓存服务器可以与之互通的其他Cache服务器。
Cache_peer_domain:设定某个特定的域名(如:.net)到指定的Cache服务器去读取缓存信息。
Neighbor_type_domain:设定该缓存服务器的邻近服务器类型。
Icp_query_timeout:ICP请求过期时间。
Maxium_icp_query_timeout:最大ICQ请求时间。
Dead_peer_timeout:判断某个端点是否失效时间。

六. 日志文件相关参数。

cache_access_log:用户访问记录Log。
cache_log:Squid本身进程的日志记录。
cache_store_log:记录Cache缓存信息。
cache_swap_log:记录cache交换信息。
emulate_httpd_log:改变Squid日志格式。
log_mime_hdrs:记录所有Accept头信息。
useragent_log:记录用户客户端信息。
referer_log:记录用户请求日志
log_fqdn:记录用户完整的主机名。
client_netmask:是否屏蔽用户的真实IP地址
strip_query_terms:是否屏蔽用户的详细请求信息。
logfile_rotate:设定日志回滚时间。

七. Squid监控相关参数。

snmp_port:设定SNMP监听端口。
snmp_access:为了安全考虑,用户可以设定SNMP的访问范围。
high_response_time_warning:设定响应事件报警。(如果响应时间过长,可以通知用户)
high_page_fault_warning:设定页面错误事件报警。
high_memory_warning:设定Squid内存使用报警。

八. Squid的下一步发展
Squid 3.0的主要变化包括:
1.完全使用C++。
2.支持64位系统。
3.更加完善的带宽管理功能。
4.支持动态文件句柄数。

九. 常用Squid配置举例

下面介绍一个我们配置hexun首页加速的实例。
预先设定了cache的存储路径为/cache,log的存储路径为/log/,squid程序的存放路径为/squid/。
1.首先下载最新版本的Squid和相应的补丁。
2.解压Squid,打上所有补丁。
3.运行
./configure --prefix=/squid/ --enable-gnuregex --enable-async-io=30 --with-aufs-threads=16 --enable-storeio="ufs,aufs,diskd,coss" --enable-heap-replacement --enable-snmp --disable-internal-dns --enable-underscores --enable-useragent-log --enable-referer-log

进行配置。
4.make; make install;
5.修改/log和/cache的所有者为nobody.nobody
Chown nobody.nobody /log/
Chown nobody.nobody /cache/

6.安装完毕后,按照如下方式配置squid.conf,

http_port 80
cache_mem 1228 MB           (最大内存为2GB)
maximum_object_size 5096 KB
maximum_object_size_in_memory 5096 KB
cache_replacement_policy heap LFUDA          (采取这两种方式性能更高效)
memory_replacement_policy heap LRU
cache_dir aufs /cache 27970 16 256
cache_access_log /log/access.log
cache_log /log/cache.log
cache_store_log none       (不需要store.log,如有必要,可以设定其存放路径)
emulate_httpd_log on       (由于日志分析需要,将其日志类型设定为和Apache一致)
cache_dns_program /squid/libexec/dnsserver        (使用外部DNS程序,这样可以加快Squid请求处理速度)
dns_children 30                                (设定外部DNS程序数量(0-32))
request_header_max_size 70 KB       (用户请求的HTTP头大小可以自行调整)
acl PURGE method PURGE
http_access allow PURGE localhost
http_access deny PURGE all
cache_effective_user nobody
cache_effective_group nobody
visible_hostname squid-3
httpd_accel_port 80    (设定需要加速的服务器服务端口)
httpd_accel_host 192.168.158.81    (需要加速服务器IP地址)
httpd_accel_single_host on    (用户的所有请求都转发到真正的服务器上)
httpd_accel_with_proxy off       (不允许用户将此加速服务器作为代理服务器使用,访问其他网站)
httpd_accel_uses_host_header on    (由于该加速服务器上有多个域名,所以需要打开该选项以便对不同的用户请求进行区分)
logfile_rotate 5    (保存5天内的日志)
forwarded_for on     (将用户的真实IP地址通过X-Forwarded-For中传递下去,主要是为了保证正确显示lucene.com.cn网站中的用户评论的真实IP地址)
snmp_port 3401     (设定SNMP端口为3401)
acl snmp src 202.99.16.0/24     (只允许这个网段的用户进行SNMP请求)
snmp_access allow snmp
strip_query_terms off    (由于咱们的日志统计系统需要获得用户的具体请求内容,而Squid缺省配置中,日志记录是不记录用户的具体请求,所以需要关闭该项,这样就可以显示用户的整个请求内容)

7.运行/squid/sbin/squid –z来创建/cache/目录。
8.运行/squid/sbin/squid –F –D –s来启动Squid进程。


十.参考资料
1. 《Unix System Administration Handbook and Linux System Administration Handbook》 by Evi Nemeth, Garth Snyder, Scott Seebass, and Trent R. Hein。
2. 《HTTP: The Definitive Guide》 by David Gourley and Brian Totty
3. RFC 1413: Identification Protocol
4. RFC 1738: Uniform Resource Locators (URL)
5. RFC 2186: Internet Cache Protocol (ICP), Version 2
6. RFC 2187: Application of Internet Cache Protocol (ICP), Version 2
7. RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax
8. RFC 2616: Hypertext Transfer Protocol—HTTP/1.1
9. RFC 2617: HTTP Authentication: Basic and Digest Access Authentication
10. RFC 2756: Hypertext Caching Protocol
11. RFC 2817: Upgrading to TLS Within HTTP/1.1
12. RFC 3040: Internet Web Replication and Caching Taxonomy
13. RFC 3143: Known HTTP Proxy/Caching Problem
s