squid编译参数之见

squid编译参数之见

      今天简单编译一个squid,参考了其他的squid编译参数,基本了解每个功能后就开始编译,完成后就直接给用上了,结果跑不到3小时squid就挂了,一看是access.log有2个G,移走access.log就ok了,在被领导鄙视之后开始纳闷,为什么其他机器只有跑的盘满了squid才会挂,这个2个G就挂了呢,后经过与其他参数的仔细对比,发现自己编译少加了一个 '--with-large-files' ,其他机器虽然没加该选项,但是是因为定时会处理掉access.log,就不会有因为log过大squid挂掉的情况了,于是乎重新编译,再次使用,跑了一天多都再没问题了,在此整理squid编译之参数,还有好多没用过,后续再补吧!~~

./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 章中被讨论。
请注意--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(),那么指定该选项。

--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验证辅助

squid2.6实例

configure options: '--prefix=/usr/local/squid' '--enable-async-io' '--enable-storeio=aufs,null' '--enable-removal-policies' '--enable-cachemgr-hostname=CNC-JMS-27.fastcdn.com' '--enable-default-err-language=Simplify_Chinese' '--enable-err-languages=Simplify_Chinese' '--enable-epoll' '--disable-ident-lookups' '--disable-hostname-checks' '--disable-poll--disable-select' '--disable-kqueue' '--enable-x-accelerator-vary' '--enable-large-cache-files' '--enable-follow-x-forwarded-for' '--with-maxfd=32768'

squid2.7实例

configure options: '--prefix=/usr/local/squid' '--enable-async-io' '--enable-async-io=128' '--enable-storeio=aufs,null,coss' '--enable-removal-policies' '--enable-cachemgr-hostname=CNC-JMS-27.fastcdn.com' '--enable-default-err-language=Simplify_Chinese' '--enable-err-languages=Simplify_Chinese' '--enable-epoll' '--disable-ident-lookups' '--disable-hostname-checks' '--disable-poll--disable-select' '--disable-kqueue' '--enable-x-accelerator-vary' '--enable-large-cache-files' '--enable-follow-x-forwarded-for' '--with-maxfd=65536'

windows下编译squid的经验


squid是什么我这里就不说了,这不是本文的重点,总之它是一个集:代理、加速、缓存、负载均衡、防盗链、访问控制等多功能的一个超牛X开源软件,如今已经广泛应用于很多领域。对于缓存和加速这一领域,如今各大门户网站都是用它做的CDN服务。

我的网站由于访问量比较大,一台服务器根本支撑不起,所以我研究了一下它,并成功的搭建了CDN服务,由多台服务器组建了一个简单的CDN网络来达到负载均衡的效果。但同时我也发现了一个问题,squid官方提供的最新稳定版本(squid-2.7stable4)默认的文件描述符(file descriptors)为2048个,一般来说一个HTTP请求会打开一个文件描述符,假如有一个网页,代码里有3个js,1个css,10张图片,那么每个访问者打开这个页面都将打开15个文件描述符,这样当这台缓存服务器同时被很多人访问时,文件描述符很快就会被用完,接着网站偶尔就会打不开,日志里会报WARNING! Your cache is running out of filedescriptors这样的错误。

到网上搜了一下,唯一的解决办法是重新编译一下squid的源代码,用参数--with-maxfd。但网上搜到的编译方法都是在linux下的,我没有看到有哪个在windows下使用squid并且在windows下编译的。我经过大半个月的研究,克服了重重困难和问题,最终成功的在windows下编译了squid,为了后人不像我这样由于搜不到任何资料,发贴询问也无人能解决,几乎绝望的放弃,所以我把自己成功的经验和走的一些弯路发出来,希望以后搜索到这篇文章的人可以借鉴和参考。

我下载了官方提供的一份最新的源代码,首先要解决的问题是怎么编译。官方文档全英文的,看得我眼睛疼,看了半天终于看懂了,大致是说有2种环境可以在windows下编译squid,一种是基于Microsoft Visual C++,另一种是基于MinGW。由于我不是搞C的,也没弄过linux,对于这些简直是七窍通了六窍。在此之前我请了一个搞C++的同事帮我编译,因为他机器上装有Microsoft Visual C++。可是他说碰到太多错误了,压根通不过编译检测,后来就没弄了,所以我不得已自己硬着头皮研究。因为他是用Microsoft Visual C++没弄出来,所以这次我打算用另一种环境MinGW来编译。

在搭建编译环境这里,我走了许多弯路,比如我是先找到了这个页面
http://squid.acmeconsulting.it/buildenvironment.html
后来才知道这个文档实际上是老版本的MinGW,需要依次安装多个东西,而新版的只有一个东西,在装的时候自己勾选相应的组件就行了。可我下到的版本却是最新的,用老的办法去装,反而会使得环境内各组件的版本不一致。我编译的时候碰到了错误,搜google才知道原来是环境问题,后来又重新检查环境,我也不懂,检查不出什么问题。只好又重新看官方文档,后来才发现了这个页面
http://squid.acmeconsulting.it/SquidNT27.html
也就是对于2.7版本的编译方法。看到这里我才发现原来还有第3种编译环境:Cygwin。不过我已经开始用MSYS + MinGW了,所以就先不考虑Cygwin。

在这个页面上,它讲的是搭建MinGW环境需要安装:
MSYS 1.0.9或更高
MinGW 3.1.0或更高
Windows API 2.4.0或更高
MSYS Developer Tool Kit 1.0.1或更高

这4个东西在官方网站上都有下载,不过我们只需要下124这3个就可以了,第3个Windows API在安装MinGW时会自动装上。首先是装MinGW,安装路径为C:\msys\1.0\mingw,装的时候勾选MinGW base tools、g++ compiler、MingW Make这3个即可。然后装MSYS,按默认的路径C:\msys\1.0装。装完配置时会有3个问题,前2个按y回车,第3个让你输入mingw的路径,C:/msys/1.0/mingw回车(注意是反斜杠),最后安装msysDTK。这样应该环境就搭建好了。

将下载的squid源代码解压至任何目录(所在路径中不能包含中文),例如c:\squidsrc。从开始菜单>MinGW>MSYS启动msys,在命令提示符下输入cd c:\squidsrc回车,这样就进入到了squidsrc目录。接下来输入

./configure --prefix=c:/squid --with-maxfd=20480 --disable-wccp --disable-wccpv2 --enable-win32-service --enable-default-hostsfile=none

--prefix=c:/squid表示将程序编译到哪个目录,这个目录也是你发布程序的安装目录。--with-maxfd=20480就是前面说的文件描述符上限了。这里我把默认的2048改到了20480,应该足够了。--disable-wccp --disable-wccpv2 这2个参数非常重要。我在这个参数上走了很多弯路,主要是没有看到官方最新文档上说,windows下不支持wccp,必须禁掉才能编译。--enable-win32-service表示可以配置为windows服务,这功能也是必须的, --enable-default-hostsfile=none表示启用但不设置默认的hosts文件路径。这个命令的含义就解释到这里。如果幸运的话,我下面这段就可以不用看了。

不过我很不幸,又碰到了很多问题。第一个问题是我运行之后,马上报找不到cfgaux/install-sh这个文件,这个问题整了我很久,因为cfgaux目录下根本没有install-sh这个文件,我去哪弄一个来呢。我先是自己建了个空的文件取名为install-sh,被我骗过去了,但后面又出现了许多错误,让我明白骗过这一步是没用的。于是又开始google,在一个英文博客上,一个老外也碰到这个问题,另一个牛人解释说,这个可能是编译环境的问题,说是缺少了一个是lib,但没说具体的解决办法,后来那家伙自己试了下执行bootstrap.sh这个文件,结果就可以了。于是我也找bootstrap.sh这个文件,果然就在源代码的根目录下。用命令./bootstrap.sh回车执行成功,果然自动在cfgaux下生成了好几个文件,其中就有install-sh这个东东。果然重新执行前面的./configure命令,就通过了。

如果配置开始了,但输出一小段后就报错结束了,显示什么gcc....no之类的东西,则说明是环境没有搭建成功。我先前就因为环境问题,一直卡在这里。问题在于我没有把mingw装在C:\msys\1.0\mingw这个目录里,导致编译器找不到mingw的目录,后来我自己剪切过去了才好。

如果配置通过了,那胜利就在眼前了。接下来输入命令make回车。不过我在这一步也卡了很久,原因是一直报一个undefined reference to的错误,找了很久也没找到解决办法。后来无意中看到官方文档说这些文件都是linux下的,在windows下要用dos格式,而我用windows下的记事本保存过几个源代码文件,尽管没改任何代码,但是一保存文件头就变了,这样导致预编译时将找不到那个文件里的函数,后来我发现只要用editplus保存就没事了。

如果make也过了,那就接着输入make install命令,就可以把文件编译到c:\squid目录了。这样整个编译过程就大功告成了。

看似简单的几个步骤,但是我却走了很大的弯路,其中最主要的原因是我不懂linux,没搞过C编程,所以这一切对我来说都非常陌生,只有摸着石头过河,所以走弯路也是很正常的。不过,经过我的总结,得出以下经验:

1.网络上搜到的资料也许都是过时了的,一定要注意其发表时间,错误的资料比没有资料更可怕。
2.一定要多看官方文档,哪怕它是全英文的,也得慢慢啃完。当然官方文档也要看最新的,最好别像我这么倒霉,总是先看到过时的
3.linux下的文件格式和windows下不同,如果要编辑,最好用editplus或其他专门的文本编辑软件来编辑和保存。
4.源代码的版本不要下错了。我一开始下到个vc++专用的版本,然后用mingw来编译,完全背道而驰,怎么可能成功呢,因为这个错误浪费了我好几天的时间
5.多问google,别轻易放弃,黄天不会负有心人

windows下编译squid的经验 补充

官方下载的squid 2.6.23用一下参数

./configure --enable-win32-service --enable-storeio='ufs aufs null coss' --enable-removal-policies='heap lru' --enable-snmp --enable-htcp --disable-wccp --disable-wccpv2 --enable-useragent-log --enable-referer-log --enable-cache-digests --enable-auth='basic ntlm digest negotiate' --enable-coss-aio-ops --enable-basic-auth-helpers='LDAP NCSA mswin_sspi' --enable-negotiate-auth-helpers=mswin_sspi --enable-ntlm-auth-helpers='mswin_sspi fakeauth' --enable-external-acl-helpers='mswin_lm_group ldap_group' --enable-large-cache-files --enable-digest-auth-helpers='password LDAP' --enable-arp-acl --with-maxfd=20480 --prefix=c:/squid

可以成功编译的参数

./configure --enable-win32-service --enable-storeio='ufs aufs null coss' --enable-removal-policies='heap lru' --enable-snmp --enable-htcp --disable-wccp --disable-wccpv2 --enable-useragent-log --enable-referer-log --enable-cache-digests --enable-auth='basic ntlm digest negotiate' --enable-basic-auth-helpers='LDAP NCSA mswin_sspi' --enable-negotiate-auth-helpers=mswin_sspi --enable-ntlm-auth-helpers='mswin_sspi fakeauth' --enable-external-acl-helpers='mswin_lm_group ldap_group' --enable-large-cache-files --enable-digest-auth-helpers='password LDAP' --enable-arp-acl --with-maxfd=20480 --prefix=c:/squid

鉴于重编译是为了优化,只保留必要功能

./configure --enable-win32-service --enable-storeio='ufs aufs null coss' --enable-removal-policies='heap lru' --enable-snmp --disable-wccp --disable-wccpv2 --enable-cache-digests --enable-large-cache-files --enable-arp-acl --with-maxfd=20480 --prefix=c:/squid


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值