/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验证辅助程序编译进来。请见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头。请见15.5章。
3.4.2 运行configure
现在我们准备运行./configure 脚本。进入源代码的顶级目录敲入./configure,后面跟上前面提到过的任意选项,例如:
% cd squid-2.5.STABLE4
% ./configure --enable-icmp --enable-htcp
./configure 的工作就是侦察你的操作系统,以发现什么东西可用,什么不可用。它首先做的事情之一就是确认你的C编译器可用。假如./configure检测到你的C编译器有问题,脚本会退出,返回如下错误:
configure: error: installation or configuration problem: C compiler
cannot create executables.
很可能你从不会看到这个消息。假如看到了,那意味着你的系统中没有C 编译器存在,或者编译器没有正确安装。请见config.log文件找到解决问题的建议。假如你的系统中有多个C编译器,你可以在运行./configure 之前设置CC环境变量,来告诉./configure使用哪个:
% setenv CC /usr/local/bin/gcc
% ./configure ...
在./configure 检查完该编译器后,它查找头文件,库文件和函数的长列表。通常你不必担心该部分。在某些实际情况中,./configure会终止以引起你的注意,某些事情可能有问题,例如没有足够的文件描述符。假如你指定不完整的或不合理的命令行选项,它也会终止。假如有错误发生,请检查config.log 输出。./configure 的最终任务是创造Makefiles和其他文件,这些文件基于squid从你系统中了解到的知识。到此为止,你准备做编译工作。
3.5 编译
一旦./configure 完成了它的工作,你简单的敲入make 开始编译源代码:
%make
正常来说,该过程很顺利,你可以见到大量的滚动行。
你也许见到一些编译器警告。大多数情况下,可以安全的忽略这些。假如这些警告非常多,并且一些看起来非常严重,请将它们报告给开发者,在第16.5 章中有描述。
假如编译过程没有错误,你可以转移到下一节,描述如何安装你刚才编译的程序。
为了验证编译是否成功,你可以再次运行make。你将看到如下输出:
% make
Making all in lib...
Making all in scripts...
Making all in src...
Making all in fs...
Making all in repl...
'squid' is up to date.
'client' is up to date.
'unlinkd' is up to date.
'cachemgr.cgi' is up to date.
Making all in icons...
Making all in errors...
Making all in auth_modules...
因为许多理由,编译步骤也许会失败,包括:
源代码bugs
通常squid源代码是完整的调试过的。然而,你也许会遇到某些bugs或问题从而阻止你编译。这种问题在新的开发版本中更容易出现,请将它们报告给开发者。
编译器安装问题
不正确安装的C编译器不能够编译squid或其他软件包。通常编译器随着操作系统预安装,所以你不必担心它。然而,假如你在操作系统安装完后,试图升级编译器,那么可能会犯错误。绝对不要把已经安装好的编译器从一台机器拷贝到另一台,除非你绝对清楚你在做什么。我觉得在每台机上独立的安装编译器总是最好的。
请确认你的编译器的头文件总是与库文件同步。头文件通常在/usr/include目录,而库文件在/usr/lib目录。Linux的流行RPM系统允许它去升级其中之一,但并非另一个。假如库文件基于不同的头文件,squid不能编译。
假如你想在开源BSD 变种之一中升级编译器,请确认在/usr/src目录中运行make world,这好过从/usr/src/lib 或/usr/src/include 中运行。
如下是一些通用的编译器问题和错误消息:
Solaris: make[1]: *** [libmiscutil.a] Error 255
这意味着./configure 不能发现ar程序。请确认/usr/ccs/bin位于你的PATH环境变量里。假如你没有安装Sun 的编译器, 那么需要GNU 的工具。(
http://www.gnu.org/directory/binutils.html).
Linux: storage size of 'rl' isn't known
这是因为头文件和库文件不匹配所致,象前面描述的一样。请确认同时升级两者。
Digital Unix: Don't know how to make EXTRA_libmiscutil_a_SOURCES. Stop.
Digital Unix的make 程序不能兼容automake 包产生的Makefile文件。例如,lib/Makefile.in包含如下行:
noinst_LIBRARIES = \
@LIBDLMALLOC@ \
libmiscutil.a \
libntlmauth.a \
@LIBREGEX@
在替换后,当lib/Makefile 被创建时,它看起来如下:
noinst_LIBRARIES = \
\
libmiscutil.a \
libntlmauth.a \
<TAB>
象上面显示的一样,最后一行包括一个不可见的TAB字符,它阻止了make。通过安装和使用GNU make,或者手工编辑lib/Makefile 如下,来解决这个问题:
noinst_LIBRARIES = \
\
libmiscutil.a \
libntlmauth.a
假如你在编译squid时遇到问题,请先检查FAQ。你也许该在Squid的web站点上搜索(使用主页里的搜索栏)。最后,假如你仍有问题,请发邮件到
squid-users@squid-cache.org列表。
3.6 安装
在编译完后,你需要把程序安装到指定的目录。可能需要超级用户权限来把它们放置到安装目录。所以,请先切换到root:
%su
password:
#make install
假如你通过使用--enable-icmp 选项,激活了squid 的ICMP衡量功能,那么必须安装pinger程序。pinger 程序必须以超级用户权限安装,因为仅仅允许root 来发送和接受ICMP 消息。
下列命令以相应的许可来安装pinger 程序:
#make install-pinger
在安装完后,你将在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
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)。第七章有关于缓存目录的所有细节。
3.7 打补丁
在你运行squid一段时间后,你可能发现需要打源代码补丁,用以修正bug或者增加试验性的功能。在squid-cache.org站点上,对重要的bug修正会发布补丁。假如你不想等到下一个官方发布版本,你能下载补丁,并且打到你的源代码中。然后你需要重新编译squid。
为了打补丁-或者有时候叫差别文件-你需要一个叫做"patch"的程序。你的操作系统必须有该程序。如果没有,你可以从GNU工具集里下载(
http://www.gnu.org/directory/patch.html).
注意假如你在使用匿名CVS(见2.4 节),你不必担心补丁文件。当你升级源代码树时,CVS系统自动升级了补丁。
为了打补丁,你必须把补丁文件存放在系统中某处。然后进入到squid的源代码目录,运行如下命令:
% cd squid-2.5.STABLE4
% patch < /tmp/patch_file
默认的,在patch程序运行时,它告诉你它正在做什么。通常输出滚动非常快,除非有问题。你能安全的忽略它输出的offset NNN lines警告。假如你不想见到所有这些输出,使用-s选项选择安静模式。
当补丁更新了源代码后,它创造了原始文件的拷贝。例如,假如你对src/http.c 打一个补丁,备份文件名就是src/http.c.orig。这样,假如你在打了补丁后想撤销这个操作,简单的重命名所有的.orig 文件到它们以前的格式。为了成功的使用该技术,建议你在打补丁之前删除所有的.orig 文件。
假如patch 程序遇到问题,它停止运行并且给出建议。通常问题如下:
在错误的目录运行patch程序——解决的方法是,进入到正确的目录,或者使用patch的-p选项。
补丁已打过——patch会告诉你是否已打过补丁文件。在这样的情况下,它会问你是否撤销这个文件的补丁。
patch 程序不能理解你赋给它的文件——补丁文件通常有三个风格:正常的,context的和unified的。旧版本的patch 程序可能不理解后两者的差异输出。从GNU的FTP站点获取最近的版本能解决该问题。
损坏的补丁文件——假如你在下载和存储补丁文件时不小心,它有可能被损坏。有时候人们以email消息发送补丁文件,在新的窗口里,它们被简单的剪切和粘贴。
在这样的系统中,剪切和粘贴能将Tab字符改变为空格,或者不正确的捆绑长行。这些改变混乱了patch。-l选项也许有用,但最好是正确的拷贝和存储补丁文件。
某些时候patch不能应用部分或所有的差别文件——在这样的情况下,你能见到类似于Hunk 3 of 4 failed的消息。失败的部分被存储在命名为.rej的文件里。例如,假如在处理src/http.c时失败,patch 程序将该差别文件片断存为src/http.c.rej。在这样的情况下,你也许能手工修正这些问题,但它通常不值得这么做。假如你有大量的"failed hunks"或者.rej文件,建议你去下载最近源代码版本的完整新拷贝。
在你打完补丁后,你必须重新编译squid。make的先进功能之一就是它仅仅编译改变了的文件。但有时候make不能理解错综复杂的依赖关系,它没有完整的重编译所需文件。为了安全起见,通常建议你去重编译所有文件。最好的方法是在开始编译之前清除源代码树:
%make clean
%make
3.8 重运行configure
有时候你可能发现有必要重新运行./configure。例如,假如你调整了内核参数,你必须再次运行./configure以使它能发现新设置。当你阅读本书时,你也发现你必须使用./configure选项来激活所需的功能。
以相同的选项重运行./configure,使用如下命令:
%config.status --recheck
另一个技术是`touch config.status`文件,它更新了该文件的时间戳。这导致make在编译源代码之前,重新运行./configure脚本:
% touch config.status
% make
如果增加或删除./configure选项,你必须重新敲入完整的命令行。假如你记不住以前的选项,请查看config.status文件的顶部。例如:
% head config.status
#! /bin/sh
# Generated automatically by configure.
# Run this file to recreate the current configuration.
Squid 中文权威指南 16
# This directory was configured as follows,
# on host foo.life-gone-hazy.com:
#
# ./configure --enable-storeio=ufs,diskd --enable-carp \
# --enable-auth-modules=NCSA
# Compiler output produced by configure, useful for debugging
# configure, is in ./config.log if it exists.
在运行./configure之后,你必须再次编译和安装squid。安全起见,建议先运行make clean:
%make clean
%make
请回想一下,./configure会缓存它在你系统中发现的东西。在这样的形式下,你可能想清除这些缓存,从头开始编译过程。假如喜欢,你可以简单的删除config.cache 文件。然后,下一次./configure运行时,它不会使用以前的数值。你也能恢复squid源代码树到它的configure之前的状态,使用如下命令:
%make distclean
这将删除所有的目标文件和其他被./configure和make程序产生的文件。
第4章 快速配置向导
4.1 squid.conf 语法
Squid 的配置文件相对规范。它与其他许多unix 程序相似。每行以配置指令开始,后面跟着数字值或关键字。在读取配置文件时,squid 忽略空行和注释掉的行(以#开始)。如下是一些配置行示例:
cache_log /squid/var/cache.log
# define the localhost ACL
acl Localhost src 127.0.0.1/32
connect_timeout 2 minutes
log_fqdn on
某些指令取唯一值。在这些情形下,重复赋予该指令不同的值,将覆盖前面的值。例如,
下面是一个连接超时值。第一行无效,因为第二行覆盖了它:
connect_timeout 2 minutes
connect_timeout 1 hour
另外,某些指令取列表值。在这些情形下,每一个新增的值都有效。"扩展方式"指令以这种方法工作:
extension_methods UNGET
extension_methods UNPUT
extension_methods UNPOST
对这些基于列表的指令,你通常能在同一行中赋予多个值:
extension_methods UNGET UNPUT UNPOST
许多指令有通用类型。例如,连接超时值是一个时间规范,在数字后面跟着时间单元。例如:
connect_timeout 3 hours
client_lifetime 4 days
negative_ttl 27 minutes
类似的,大量的指令指向文件大小或者内存额度。例如,你可以这样编写大小规范:十进制数字后面跟bytes,KB,MB 或GB.例如:
minimum_object_size 12 bytes
request_header_max_size 10 KB
maximum_object_size 187 MB
另一种值得提起的类型是触发器,它的值是on 或者off。许多指令使用该类型。例如:
server_persistent_connections on
strip_query_terms off
prefer_direct on
通常,配置文件指令能以任何顺序出现。然而,如果某个指令指向的值被其他指令所定义,那么顺序就很重要。访问控制列表是个好的例子。acl 被用在http_access 规则之前必须被定义:
acl Foo src 1.2.3.4
http_access deny Foo
squid.conf 文件里的许多东西是大小写敏感的,例如指令名。你不能将http_port 写成HTTP_port。
默认的squid.conf 文件包含了对每个指令的大量注释,以及指令的默认值。例如:
# TAG: persistent_request_timeout
# How long to wait for the next HTTP request on a persistent
# connection after the previous request completes.
#
#Default:
# persistent_request_timeout 1 minute
每次安装squid 后,当前默认配置文件存放在$prefix/etc 目录下的squid.conf.default。既然指令每次都有所改变,你能参考该文档,以获取最近的更新。
该章剩下的部分是关于在开始运行squid 之前,你必须知道的少数指令。
4.2 User IDs
你可能知道,unix 进程和文件拥有文件和组属主的属性。你必须选择某个用户和组给squid。该用户和组的组合,必须对大部分squid 相关的文件和目录有读和写的权限。
我高度推荐创建名为"squid"的用户和组。这避免了某人利用squid 来读取系统中的其他文件。假如不止一个人拥有对squid 的管理权限,你可以将他们加到squid 组里。
unix 进程继承了它们父进程的属主属性。那就是说,假如你以joe 用户来启动squid,squid 也以joe 来运行。假如你不想以joe 来运行squid,你需要预先改变你的用户ID。这是su 命令的典型功能。例如:
joe% su - squid
squid% /usr/local/squid/sbin/squid
不幸的是,运行squid 并非总是如此简单。在某些情况下,你必须以root 来启动squid,这依赖于你的配置。例如,仅仅root 能绑定TCP 套接字到特权端口上,如80。假如你必须以root 来启动squid,你必须设置cache_effective_user 指令。它告诉squid,在执行完需要特别权限的任务后,变成哪个用户。例如:
cache_effective_user squid
你提供的该名字必须是有效用户(在/etc/passwd 文件里)。请注意仅仅当你以root 来启动squid 时,你才需要用到该指令。仅仅root 有能力来随意改变用户身份。假如你以joe 来启动squid,它不能改变到squid 用户。
你可能尝试不设置cache_effective_user,直接以root 来运行squid。假如你试过,你会发现squid 拒绝运行。这违背了安全规则。假如外部攻击者有能力危及或利用squid,他能获取对系统的全部访问权。尽管我们努力使squid 安全和少bug,但还是稳重点好。
假如你没有设置cache_effective_user,以root 来启动squid,squid 使用nobody 作为默认值。不管你选择什么用户ID , 请确认它有对下面目录的读访问权:$prefix/etc,$prefix/libexec,$prefix/share。该用户ID 也必须有对日志文件和缓存目录的写访问
权。
squid 也有一个cache_effective_group 指令,但你也许不必设置它。默认的,squid 使用cache_effective_user 的默认组(从/etc/passwd 文件读取)。
4.3 端口号
http_port 指令告诉squid 在哪个端口侦听HTTP 请求。默认端口是3128:
http_port 3128
假如你将squid 作为加速器运行(见15 章),你也许该将它设为80。
你能使用附加的http_port 行,来指示squid 侦听在多个端口上。假如你必须支持客户组(它们被配置得不一致),这点就经常有用。例如,来自某个部门的浏览器发送请求到3128,
然而另一个部门使用80 端口。简单的将两个端口号列举出来:
http_port 3128
http_port 8080
你也能使用http_port 指令来使squid 侦听在指定的接口地址上。当squid 作为防火墙运行时,它有两个网络接口:一个内部的和一个外部的。你可能不想接受来自外部的http 请求。为了使squid 仅仅侦听在内部接口上,简单的将IP 地址放在端口号前面:
http_port 192.168.1.1:3128
4.4 日志文件路径
我将在第13 章讨论所有squid 的日志细节。你现在你关注的唯一事情是,squid 将它的日志放在何处。默认的日志目录是squid 安装位置下的logs 目录。例如,假如你在./configure
时没有使用--prefix=选项,那么默认的日志文件路径是/usr/local/squid/var/logs。
你必须确认日志文件所存放的磁盘位置空间足够。在squid 写日志时如果接受到错误,它会退出和重启。该行为的主要理由应引起你的注意。squid 想确认你不会丢失任何重要的日志信息,特别是你的系统被滥用或者被攻击时。
squid 有三个主要的日志文件:cache.log,access.log,store.log.第一个文件即cache.log,包含状态性的和调试性的消息。当你刚开始运行squid 时,你应密切的关注该文件。假如squid拒绝运行,理由也许会出现在cache.log 文件的结尾处。在正常条件下,该文件不会变得很大。也请注意,假如你以-s 选项来运行squid,重要的cache.log 消息也可被送到你的syslog进程。通过使用cache_log 指令,你可以改变该日志文件的路径:
cache_log /squid/logs/cache.log
access.log 文件包含了对squid 发起的每个客户请求的单一行。每行平均约150 个字节。也就是说,在接受一百万条客户请求后,它的体积约是150M。请使用cache_access_log 指令来改变该日志文件的路径:
cache_access_log /squid/logs/access.log
假如因为某些理由,你不想squid 记录客户端请求日志,你能指定日志文件的路径为/dev/null.
store.log 文件对大多数cache 管理员来说并非很有用。它包含了进入和离开缓存的每个目标的记录。平均记录大小典型的是175-200 字节。然而,squid 不在store.log 里对cache点击创建接口,所以它比access.log 包含少得多的记录。请使用cache_store_log 指令来改变它的位置:
cache_store_log /squid/logs/store.log
通过指定路径为none,你能轻易的完全禁止store.log 日志:
cache_store_log none
假如你不小心,squid 的日志文件增加没有限制。某些操作系统对单个文件强制执行2G的大小限制,即使你有充足的磁盘空间。超过该限制会导致写错误,这样squid 就会退出。为了保证日志文件大小合理,你应创建任务来有规律的重命名和打包日志。squid 有内建功能来使这个容易做到。请见13.7 章关于日志轮循的解释。
4.5 访问控制
在第6 章里有更多的关于访问控制的描述。现在,我只讲述少量的访问控制方法,以使热心的读者能快速开始使用squid。
squid 默认的配置文件拒绝每一个客户请求。在任何人能使用代理之前,你必须在squid.conf 文件里加入附加的访问控制规则。最简单的方法就是定义一个针对客户IP 地址的ACL 和一个访问规则,告诉squid 允许来自这些地址的HTTP 请求。squid 有许多不同的ACL类型。src 类型匹配客户IP 地址,squid 会针对客户HTTP 请求检查http_access 规则。这样,你需要增加两行:
acl MyNetwork src 192.168.0.0/16
http_access allow MyNetwork
请将这些行放在正确的位置。http_access 的顺序非常重要,但是acl 行的顺序你不必介意。你也该注意默认的配置文件包含了一些重要的访问控制,你不应该改变或删除它们,除非你完全理解它们的意义。在你第一次编辑squid.conf 文件时,请看如下注释:
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
在该注释之后,以及"http_access deny all"之前插入你自己的新规则。
为了彻底说明,如下是一个合理的初始访问控制配置,包括推荐的默认控制和早先的例子:
acl All src 0/0
acl Manager proto cache_object
acl Localhost src 127.0.0.1/32
acl Safe_ports port 80 21 443 563 70 210 280 488 591 777 1025-65535
acl SSL_ports 443 563
acl CONNECT method CONNECT
acl MyNetwork src 192.168.0.0/16
http_access allow Manager Localhost
http_access deny Manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow MyNetwork
http_access deny All
4.6 可见主机名
希望你不必担心visible_hostname 指令。然而,假如squid 不能发现它所运行的机器的主机名,你就必须设置它。如果发生这样的事,squid 抱怨和拒绝运行:
% squid -Nd1
FATAL: Could not determine fully qualified hostname. Please set 'visible_hostname'
有大量的理由使squid 需要知道主机名:
+ 主机名出现在squid 的错误消息里,这帮助用户验证潜在问题的源头。
+ 主机名出现在squid 转发的cache 单元的HTTP Via 头里。当请求到达原始主机时,Via头包含了在传输过程中涉及的代理列表。squid 也使用Via 头来检测转发环路。我将在第10章里讨论转发环路。
squid 对特定事务使用内部URL,例如FTP 目录列表的图标。当squid 对FTP 目录产生HTML 页面时,它插入小图标用以指明该目录中的文件类型。图标URL 包含了cache 的主机名,以便web 浏览器能直接从squid 请求它们。
每个从squid 响应的HTTP 回复包含了X-Cache 头。这并非官方HTTP 头。它是一个扩展头,用以指明该响应是cache 点击还是cache 丢失。既然请求和响应可能经过多个cache,每个X-Cache 头包含了cache 报告点击或丢失的名字。如下是一个通过2 个cache 的响应示例:
HTTP/1.0 200 OK
Date: Mon, 29 Sep 2003 22:57:23 GMT
Content-type: text/html
Content-length: 733
X-Cache: HIT from bo2.us.ircache.net
X-Cache: MISS from bo1.us.ircache.net
squid 在启动时试图自动获取主机名。首先它调用gethostname()函数,这通常能返回正确的主机名。接着,squid 调用gethostbyname()函数尝试对主机名进行DNS 查询。该函数典型的返回IP 地址和系统的规范名。假如gethostbyname()成功,squid 在错误消息里,Via 头里等地方使用这个规范名。
因为大量的理由,squid 可能不能检测到它的规范主机名,包括:
+ 主机名可能未设置。
+ 主机名可能从DNS 区域或/etc/hosts 文件里丢失。
squid 系统的DNS 客户端配置可能不正确或丢失。在unix 系统上,你该检查/etc/resolv.conf 和/etc/host.conf 文件。
假如你看到上述的致命错误,你必须修正主机名和DNS 信息,或者显式的给squid 指明主机名。在大多数情况下,请确认"hostname"命令返回一个完全规范的主机名,并且在/etc/hosts 文件里增加这个接口。假如这样不成功,请在squid.conf 里设置可见主机名:
visible_hostname squid.packet-pushers.net
4.7 管理联系信息
你应该设置cache_mgr 指令作为对用户的帮助。它是一个email 地址,假如问题发生,用户能写信给它。cache_mgr 地址默认出现在squid 的错误消息里。例如:
cache_mgr
squid@web-cache.net
4.8 下一步
在创建了初步的配置文件后,你多少准备首次运行squid 了。请遵循下面章节的建议。
当你掌握了启动和停止squid 后,你该花费一些时间来改善配置文件。你可能想增加更高级的访问控制,这在第6 章里有描述。既然我在这里没有讨论磁盘cache,你该花些时间阅读第7 和第8 章