squid 学习笔记(1) 代理:

squid 学习笔记(1)
代理:

Squid是什么?

Squid是一种用来缓冲Internet数据的软件。它是这样实现其功能的,接受来自人们需要下载的目标(object)的请求并适当地处理这些请求。也就是说,如果一个人想下载一web页面,他请求Squid为他取得这个页面。Squid随之连接到远程服务器(比如:http://squid.nlanr.net/)并向这个页面发出请求。然后,Squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时,Squid可以简单地从磁盘中读到它,那样数据迅即就会传输到客户机上。当前的Squid可以处理HTTP,FTP,GOPHER,SSL和WAIS等协议。但它不能处理如POP,NNTP,RealAudio以及其它类型的东西。
 

Web 缓存

cache 命中在 squid 每次从它的缓存里满足 HTTP 请求时发生。cache 命中率,是 所有 HTTP 请求中命中的比例。Web 缓存典型的 cache 命中率在 30%到 60%之间。 另一个相似的度量单位叫做字节命中率,描绘了 cache 提供服务的数据容量(字 节数)。

cache 丢失在 squid 不能从它的缓存里满足 HTTP 请求时发生。cache 丢失的理由 有很多种。最明显的,当 squid 第一次接受到对特殊资源的请求时,就是一个 cache 丢失。类似的情况是,squid 会清除缓存以释放空间给新对象。另外的可 能是资源不可到达。原始服务器会指示 cache 怎样处理响应。例如,它会提示数 据不能被缓存,或在有限的时间内才被重复使用,等等。 cache 确认保证 squid 不对用户返回过时数据。在重复使用缓存对象时,squid 经常从原始服务器确认它。假如服务器指示 squid 的拷贝仍然有效,数据就发送 出去。否则,squid 升级它的缓存拷贝,并且转发给客户。

硬件和操作系统要求

squid 对硬件要求不算高。内存是最重要的资源。内存短缺会严重影响性能。磁 盘空间也是另一个重要因素。更多的磁盘空间意味着更多的缓存目标和更高的命 中率。快速的磁盘和驱动器也是有利的。如果你舍得花钱,SCSI 磁盘比 ATA 的 执行性能好。当然快速的 CPU 也是好的,但它并不是提高性能的关键因素。

临时端口范围

临时端口是 TCP/IP 栈分配给出去连接的本地端口。换句话说,当 squid 发起一 条连接到另一台服务器,内核给本地 socket 分配一个端口号。这些本地端口号 有特定的范围限制。例如,在 FreeBSD 上,默认的临时端口范围是 1024-5000。 临时端口号的短缺对非常忙的代理服务器(例如每秒数百个连接)来说,会较大 的影响性能。这是因为一些 TCP 连接在它们被关闭时进入 TIME_WAIT 状态。当连 接进入 TIME_WATI 状态时,临时端口号不能被重用。 你能使用 netstat 命令来显示有多少个连接进入这个状态:

netstat -n | grep TIME_WAIT 

如果你没有看到数千个临时端口在 TIME_WAIT 状态,那也许不必增加这个端口范 围。在 Freebsd 上,用如下命令增加临时端口范围:

sysctl -w net.inet.ip.portrange.last=30000 

  

configure 选项

./configure 脚本有大量的不同选项,它们以-开始。当你敲入./configure --help 时,能看到选项的完整列表。一些选项对所有 configure 脚本是通用的, 还有一些是 squid 专有的。

--perfix =PREFIX 

设置安装目录。安装目录是所有可执行文件,日志,和 配置文件的默认目录。

--localstatedir =DIR 

该选项改变 var 目录的安装位置。默认是$prefix/var,但也许你想改变 它,以使 squid 的磁盘缓存和日志文件被存储在别的地方。

--sysconfdir =DIR

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

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

--enable-dlmalloc[=LIB] 

使用--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。

--enable-async-io[=N_THREADS] 

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

请注意--enable-async-io 是打开其他三个./configure 选项的快捷方式,它等 同于: --with-aufs-threads=N_THREADS --with-pthreads --enable-storeio=ufs,aufs --with-pthreads

该选项导致编译过程链接到你系统中的 P 线程库。aufs 存储模块是 squid 中唯 一需要使用线程的部分。通常来说,如果你使用--enable-saync-io 选项,那么 不必再单独指定该选项,因为它被自动激活了。

--enable-storeio=LIST

Squid 支持大量的不同存储模块。通过使用该选项,你告诉 squid 编译时使用哪 个模块。在 squid-2.5 中,支持 ufs,aufs,diskd,和 null 模块。通过查询 src/fs 中的目录,你能得到一个模块列表。 LIST 是一个以逗号分隔的模块列表,例如: % ./configure --enable-storeio=afus,diskd,ufs ufs 模块是默认的,看起来问题最少。

--with-aufs-threads=N_THREADS

指定 aufs 存储机制使用的线程数量。squid 默认根据缓存目录的 数量,自动计算需要使用多少线程。

--enable-heap-replacement 

该选项不再使用,但被保留用于向后兼容性。你该使用--enable-removal-policies来代替。

--enable-removal-policies=LIST

排除策略是 squid 需要腾出空间给新的 cache 目标时,用以排除旧目标的机制。 squid-2.5 支持 3 个排除策略:最少近期使用(LRU),贪婪对偶大小(GDS),最少经 常使用(LFU)。然而,因为一些理由,./configure 选项使指定的替代策略和需 要执行它们的基本数据结构之间的差别模糊化。LRU 是默认的,它以双链表数据 结构执行。GDS 和 LFU 使用堆栈的数据结构。

为了使用 GDS 或 LFU 策略,你指定:

--enable-removal-policies=heap

 然后你在 squid 的配置文件里选择使用 GDS 或 LFU。假如你想重新使用 LRU,那么 指定:

 ./configure --enable-removal-policies=heap,lru

  

--enable-icmp

squid 能利用 ICMP 消息来确定回环时间尺寸,非常 象 ping 程序。你能使用该选项来激活这些功能。

--enable-delay-pools

延时池是 squid 用于传输形状或带宽限制的技术。该池由大量的客户端 IP 地址 组成。当来自这些客户端的请求处于 cache 丢失状态,他们的响应可能被人工延 迟。

 

--enable-useragent-log

该选项激活来自客户请求的 HTTP 用户代理头的日志。

--enable-referer-log 

该选项激活来自客户请求的 HTTP referer 日志。

--disable-wccp Web cache

协调协议(WCCP)是 CISCO 的专有协议,用于阻止或分发 HTTP 请求到 一个或多个 caches。WCCP 默认被激活,假如你愿意,可以使用该选项来禁止该 功能。

--enable-snmp

简单网络管理协议(SNMP)是监视网络设备和服务器的流行方法。该选项导致编译 过程去编译所有的 SNMP 相关的代码,包括一个裁切版本的 CMU SNMP 库。

--enable-cachemgr -hostname[=hostname]

cachemgr 是一个 CGI 程序,你能使用它来管理查询 squid。默认 cachemgr 的 hostname 值是空的,但你能使用该选项来指定一个默认值。例如:

./configure --enable-cachemgr-hostname=mycache.myorg.net

 

--enable-arp-acl

squid在一些操作系统中支持 ARP,或者以太地址访问控制列表。该代码使用非标 准的函数接口,来执行 ARP 访问控制列表,所以它默认被禁止。假如你在 linux 或 solaris 上使用 squid,你可能用的上这个功能。 

--enable-htcp  

HTCP 是超文本缓存协议--类似于 ICP 的内部缓存协议。

--enable-ssl

使用该选项赋予 squid 终止 SSL/TLS 连接的能力。注意这仅仅工作在 web 加速器 中用以加速请求。

--with-openssl[=DIR]

假如必要,你使用该选项来告诉 squid 到哪里找到 OpenSSL 库或头文件。假如它 们不在默认位置,在该选项后指定它们的父路径。例如:

./configure --enable-ssl --with-ssl=/opt/foo/openssl 

  

--enable-cache-digests

Cache 消化是 ICP 的另一个替代,但有着截然不同的特性。

--enable-err-languages="lang1 lang2 ..."

squid 支持定制错误消息,错误消息可以用多种语言报告。该选项指定复制到安 装目录($prefix/share/errors)的语言。假如你不使用该选项,所有可用语言被 安装。想知道何种语言可用,请见源代码包里 errors 目录下的目录列表。如下 显示如何激活多种语言:

--enable-err-languages="lang1 lang2 ..."

该选项设置 error_directory 指令的默认值。例如,假如你想使用荷兰语,你能 这样指定: 

 ./configure --enable-default-err-language=Dutc

你也能在 squid.conf 里指定 error_directory 指令,在附录 A 中有描述。假如 你忽略该选项,英语是默认错误语言。

--with-coss-membuf-size=N

循环目录存储系统(coss)是 squid 的试验性存储机制。该选项设置 coss 缓存 目录的内存缓冲大小。注意为了使用 coss,你必须在--enable-storeio 选项里 指定存储类型。 该参数以字节形式赋值,默认是 1048576 字节或 1M。你能指定 2M 缓冲如下:

./configure --with-coss-membuf-size=2097152

  

--enable-poll 

unix 提供两个相似的函数用以在 I/O 事件里扫描开放文件描述符:select()和 poll()../configure 脚本通常能非常好的计算出何时使用 poll()来代替 select().假如你想强制使用 poll(),那么指定该选项。

--desable-poll 类似的,如果不使用 poll(),那么指定该选项。

--disable-http-violations

squid 默认可以被配置成违背 HTTP 协议规范。你能使用该选项来删除违背 HTTP 协议的代码。

--enable-ipf-transparent

配置 squid 来拦截缓存,一些操作系统使用 IP Filter 包来协助拦截缓存。在这些环境下你应该使用该./configure 选项。如果你使用 了该选项,但是编译器提示 src/client_side.c 文件出错,那是因为 IP Filter 包没有或没有正确的安装在你的系统中。

--enable-pf-transparent 你可能需要指定该选项,使用 PF 包过滤器在操作系统中拦截 HTTP。PF 是 OpenBSD 的标准包过滤器,也可能被发布到其他系统中。假如你使用该选项,但是编译器 提示 src/client_side.c 文件出错,那是因为 PF 没有实际安装到你的系统中。

--enable-linux-netfilter Netfilter 是 linux 2.4 系列内核的包过滤器名字。假如你想在 linux2.4 或以 后的版本中使用 HTTP 拦截功能,那么激活该选项。

--disable-ident-lookups ident 是一个简单的协议,允许服务器利用客户端的特殊 TCP 连接来发现用户 名。假如你使用该选项,编译器将把执行这些查询的代码排除出去。即使你在编 译时保留了这些代码,除非你在 squid.conf 文件里指定,squid 不会执行 ident 查询。

--disable-internal-dns squid 源代码包含两个不同的 DNS 解决方案,叫做“内部的”和“外部的”。内 部查询是默认的,但某些人可能要使用外部技术。该选项禁止内部功能,转向使 用旧的方式。 内部查询使用 squid 自己的 DNS 协议执行工具。也就是说,squid 产生未完成的 DNS 查询并且将它们发送到一个解析器。假如超时,它重新发送请求,你能指定 任意数量的解析器。该工具的有利处之一是,squid 获得准确无误的 DNS 响应的 TTLs。 外部查询利用 C 库的 gethostbyname()和 gethostbyaddr()函数。squid 使用一 个外部进程池来制造并行查询。使用外部 DNS 解析的主要弊端是你需要更多的辅 助进程,增加 squid 的负载。另一个麻烦是 C 库函数不在响应里传输 TTLs,这 样 squid 使用 postive_dns_ttl 指令提供的一个常量值。

--enable-truncate truncate()系统调用是 unlink()的替代品。unlink()完全删除 cache 文件, truncate()将文件大小设为零。这样做释放了分配给该文件的磁盘空间,但留下 适当的目录接口。该选项存在的理由是,某些人相信(或希望)truncate()比 unlink()性能表现更好。然而,压力测试显示两者有很少的或根本没有区别。

--disable-hostname-checks 默认的,squid 要求 URL 主机名在一定程度上遵守古老的 RFC 1034 规范: 标签必须遵循下列 ARPANET 主机名规则。它们必须以字母开始,以字母或数字结 尾,仅仅包含字母,数字和下划线。 这里字母意味着 ASCII 字符,从 A 到 Z。既然国际域名日益流行,你可能希望使 用该选项来移除限制。

--enable-underscores 该选项控制 squid 针对主机名里下划线的行为。通用的标准是主机名里不包含下 划线字符,尽管有些人不赞成这点。squid 默认会对 URL 主机名里带下划线的请 求产生一条错误消息。你能使用该选项,让 squid 信任它们,把它们当作合法的。 然而,你的 DNS 解析器也许强迫使用非下划线请求,并且对带下划线的主机名解 析失败。

--enable-auth[=LIST] 该选项控制在 squid 的二进制文件里支持哪种验证机制。你能选择下列机制的任 意组合:basic,digest,ntlm.假如你忽略该选项,squid 仅仅支持 basic 验证。 假如你使用不带参数的--enable-auth 选项,编译进程将增加对所有验证机制的 支持。你可以使用以逗号分隔的验证机制列表:

./configure --enable-auth=digest,ntlm

--enable-auth-helpers=LIST 这个旧选项现在已舍弃了,但为了保持向后兼容性仍保留着。你可以使用 --enable-basic-auth-helperes=LIST 来代替。 --enable-basic-auth-helpers=LIST,使用该选项,你能将 helpers/basic_auth 目录的一个或多个 HTTP Basic 验证辅 助程序编译进来。

--enable-digest-auth-modules=LIST 使用该选项,你能将 helpers/digest_auth 目录的一个或多个 HTTP Digest 验证 辅助程序编译进来。

--enable-external-acl-helpers=LIST 使用该选项,你能编译一个或多个扩展 ACL 辅助程序 ./configure --enable-external-acl-helpers=ip_user,ldap_group

--disable-unlinkd unlinkd 是另一个 squid 的外部辅助进程。它的基本工作是对 cache 文件执行 unlink()或 truncate()系统调用。通过在外部进程里执行文件删除工作,能给 squid 带来明显的性能提升。使用该选项来禁止外部 unlink 进程功能。

--enable-stacktrace 某些系统支持在程序崩溃时,自动产生数据追踪。当你激活该功能后,如果 squid 崩溃,数据追踪信息被写到 cache.log 文件。这些信息对开发和程序 bug 调试有 用。

--enable-x-accelerator-vary 该高级功能可能在 squid 被配置成加速器时使用。它建议 squid 在响应请求时, 从后台原始服务器中寻找 X-Accelerator-Vary 头。