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 章中被讨论。
2009-09-27 09:28 举报
已邀请:
0

阿铭 管理员

赞同来自:

请注意--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 模块是默认的,看起来问题最少。不幸的是,他性能有限。其他模块可能在某些操作系统中不必编译。关于squid 存储模块的完整描述,请见第8章。
--with-aufs-threads=N_THREADS

指定aufs 存储机制使用的线程数量(见8.4章)。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 策略,您指定:
% ./configure --enable-removal-policies=heap

然后您在squid 的配置文档里选择使用GDS或LFU。假如您想重新使用LRU,那么指定:
% ./configure --enable-removal-policies=heap,lru
更多的关于替换策略的细节请见7.5 章。

--enable-icmp
如在10.5 章中描述的相同,squid 能利用ICMP消息来确定回环时间尺寸,很象ping程式。您能使用该选项来激活这些功能。

--enable-delay-pools
延时池是squid 用于传输形状或带宽限制的技术。该池由大量的客户端IP 地址组成。当来自这些客户端的请求处于cache 丢失状态,他们的响应可能被人工延迟。关于延时池的更多细节请见附录C。 . 

--enable-useragent-log
该选项激活来自客户请求的HTTP 用户代理头的日志。更多细节请见13.5 章。

--enable-referer-log
该选项激活来自客户请求的HTTP referer 日志。更多细节请见13.4 章。

--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的内部缓存协议。更多细节请见10.8 章。

--enable-ssl
使用该选项赋予squid 终止SSL/TLS 连接的能力。注意这仅仅工作在web加速器中用以加速请求。更多细节请见15.2.2 章节。

--with-openssl[=DIR]
假如必要,您使用该选项来告诉squid到哪里找到OpenSSL库或头文档。假如他们不在默认位置,在该选项后指定他们的父路径。例如:
% ./configure --enable-ssl --with-ssl=/opt/foo/openssl
在这个例子中,您的编译器将在/opt/foo/openssl/include目录中找头文档, 在/opt/foo/openssl/lib 中找库文档。

--enable-cache-digests
Cache 消化是ICP 的另一个替代,但有着截然不同的特性。请见10.7 章。

--enable-err-languages="lang1 lang2 ..."
squid支持定制错误消息,错误消息能够用多种语言报告。该选项指定复制到安装目录($prefix/share/errors)的语言。假如您不使用该选项,任何可用语言被安装。想知道何种语言可用,请见源代码包里errors目录下的目录列表。如下显示如何激活多种语言:
% ./configure --enable-err-languages="Dutch German French" ... .

--enable-default-err-language=lang
该选项配置error_directory 指令的默认值。例如,假如您想使用荷兰语,您能这样指定:
% ./configure --enable-default-err-language=Dutch
您也能在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(),那么指定该选项。
0

阿铭 管理员

赞同来自:

--disable-http-violations
squid 默认能够被配置成违背HTTP协议规范。您能使用该选项来删除违背HTTP协议的代码。

--enable-ipf-transparent
在第9章中,我将描述如何配置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验证辅助程式编译进来。请见12.2章找到他们的名字和描述。

--enable-ntlm-auth-helpers=LIST
使用该选项,您能将helpers/ntlm_auth 目录的一个或多个HTTP NTLM验证辅助程式编译进来。请见12.4章找到他们的名字和描述。

--enable-digest-auth-modules=LIST
使用该选项,您能将helpers/digest_auth 目录的一个或多个HTTP Digest验证辅助程式编译进来。请见12.3章找到他们的名字和描述。

--enable-external-acl-helpers=LIST
使用该选项,您能编译一个或多个扩展ACL辅助程式,这些在12.5章中讨论。例如:
% ./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头。 ..

在安装完后,您将在squid 的安装目录里(默认是/usr/local/squid)见到下列目录和文档:

sbin
sbin 目录的程式正常只能被root 启动

sbin/squid
Squid 的主程式

bin
bin 目录包含对任何用户可用的程式

bin/RunCache
RunCache是个shell脚本,您能用他来启动squid。假如squid死掉,该脚本自动重启他,除非他检测到经常的重启。RunCache是个时间遗留的产物,那时Squid还不是后台服务进程。在最近的版本里,RunCache很少用到,因为Squid自动重启他自身,当您不使用-N选项时。

bin/RunAccel
0

阿铭 管理员

赞同来自:

RunAccel 和RunCache 几乎一致,唯一的不同是他增加了一个命令行参数,告诉squid在哪里侦听HTTP 请求。

bin/squidclient
squidclient 是个简单的HTTP 客户端程式,您能用他来测试squid。他也有一些特别功能,用以对运行的squid 进程发起管理请求。

libexec
libexec 目录传统的包含了辅助程式。有一些命令您不能正常的启动。然而,这些程式通常被其他程式启动。

libexec/unlinkd
unlinkd是个辅助程式,他从cache目录里删除文档。如您后面看到的相同,文档删除是个性能瓶颈。通过在外部进程里执行删除操作,Squid提升了一些执行性能。

libexec/cachemgr.cgi
cachemgr.cgi是Squid管理功能的CGI接口。为了使用他,您需要拷贝该程式到您的WEB服务器的cgi-bin目录。在14.2章中有更多描述。

libexec/diskd(optional)
假如您指定了--enable-storeio=diskd,您才能看到他。

libexec/pinger(optional)
假如您指定了--enable-icmp,您才能看到他。

etc
etc 目录包含squid 的配置文档。

etc/squid.conf
这是squid的主要配置文档。初始的该文档包含了大量的注释,用以解释每一个选项做什么。在您理解了这些配置指令后,建议您删除这些注释,让配置文档更小和更容易阅读。注意假如该文档存在,安装过程不会覆盖该文档。 版权申明:本站文章均来自网络,本站所有转载文章言论不代表本站观点

etc/squid.conf.default
这是从源代码目录中拷贝过来的默认配置文档。在升级了squid安装后,您也许发现有一份当前默认配置文档的拷贝是有用的。可能会增加新的配置指令,一些存在的旧指令可能有所改变。

etc/mime.conf
mime.conf文档告诉squid 对从FTP和Gopher服务器获取的数据使用何种MIME类型。该文档是个关联文档名扩展到MIME类型的表。正常而言,您不必编辑该文档。然而,您可能需要增加特别文档类型的接口,他们在您的组织内使用。

etc/mime.conf.default
这是从源代码目录里拷贝过来的默认mime.conf文档。

share
share目录通常包括squid的只读数据文档。

share/mib.txt
这是squid的SNMP管理信息基础(MIB)文档。squid自身不使用该文档,然而,您的SNMP客户端软件(例如snmpget和多路由走向图(MRTG))需要该文档,用以理解来自squid的SNMP对象可用。

share/icons
share/icons目录包含大量的小图标文档,squid用在FTP和Gopher目录列举里。正常而言,您不必担心这些文档,但假如需要,您能够改变他们。

share/errors
share/errors目录包含了squid显示给用户看的错误消息模板。这些文档在您安装squid时,从源代码目录拷贝而来。假如需要您能够编辑他们。然而,在每次运行make install时,安装过程总会覆盖他们。所以假如您想定制错误消息,建议您把他们放在不同的目录。 . 

var
var目录包含了不是很重要的和经常变化的文档。这些文档您不必正常的备份他们。

var/logs
var/logs目录是squid 不同日志文档的默认位置。当您第一次安装squid 时,他是空的。一旦squid开始运行,您能在这里看到名字为access.log,cache.log和store.log这样的文档。

var/cache
假如您不在squid.conf文档里指定,这是默认的缓存目录(cache_dir)。 。
0

hanwen

赞同来自:

用心良苦啊。
0

krven

赞同来自:

老师 啊 东西是好东西 记忆练习好多遍啊 受虐中。。。。。。
0

lky

赞同来自:

铭哥,这个squid是编译安装的,我用yum安装的也能进行上述的操作吗?yum安装的squid与这个有什么区别?

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: