在互联网中我们经常见到代理服务器,那么究竟什么是代理服务器呢?

在TCP/IP网络中,传统的通信过程是这样的:客户端向服务器请求数据,服务器响应该请求, 将数据传送给客户端。在引入了代理服务器以后,这一 过程变成了这样:客户端向服务器发起请求,该请求被送到代理服务器;代理服务器分析该请求,先查看自己缓存中是否有请求数据,如果有就直接传送给客户端, 如果没有就代替客户端向该服务器发出请求。服务器响应以后,代理服务器将响应的数据传送给客户端,同时在自己的缓存中保留一份该数据的拷贝。这样,再有客 户端请求相同的数据时,代理服务器就可以直接将数据传送给客户端,而不需要再向该服务器发起请求。

代理服务器的功能

1).通过缓存增加访问速度

随着Internet的迅猛发展,网络带宽变得越来越珍贵。所以为了提高访问速度,好多ISP都提供代理服务器,通过代理服务器的缓存功能来加快 网络的访问速度。一般说来,大多数的代理服务器都支持HTTP缓存,但是,有的代理服务器也支持FTP缓存。在选择代理服务器时,对于大多数的组织,只需 要HTTP缓存功能就足够了。
通常,缓存有主动缓存被动缓存之分。所谓被动缓存,指的是代理服务器只在客户端请求数据时才将服务器返回的数据进行缓存,如果数据过期了,又有客 户端请求相同数据时,代理服务器又必须重新发起新的数据请求,在将响应数据传送给客户端时又进行新的缓存。所谓主动缓存,就是代理服务器不断地检查缓存中 的数据,一旦有数据过期,则代理服务器主动发起新的数据请求来更新数据。这样,当有客户端请求该数据时就会大大缩短响应时间。还需要说明的是,对于数据中 的认证信息,大多数的代理服务器都不会进行缓存的。

2).提供用私有IP访问Internet的方法

IP地址是不可再生的宝贵资源,假如你只有有限的IP地址,但是需要提供整个组织的Internet访问能力,那么,你可以通过使用代理服务器来实现这一点。

3).提高网络的安全性

这一点是很明显的,如果内部用户访问Internet都是通过代理服务器,那么,代理服务器就成为进入Internet的唯一通道;反过来说,代 理服务器也是Internet访问内部网的唯一通道,如果你没有做反向代理,则对于Internet上的主机来说,你的整个内部网只有代理服务器是可见 的,从而大大增强了网络的安全性。

squid简介

对于web用户来说,Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher和HTTP协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。

Squid将数据元缓存在内存中,同时也缓存DNS查询的结果,除此之外,它还支持非模块化的DNS查询,对失败的请求进行消极缓存。Squid 支持SSL,支持访问控制。由于使用了ICP(轻量Internet缓存协议),Squid能够实现层叠的代理阵列,从而最大限度地节约带宽。

Squid由一个主要的服务程序squid,一个DNS查询程序dnsserver,几个重写请求和执行认证的程序,以及几个管理工具组成。当 Squid启动以后,它可以派生出预先指定数目的dnsserver进程,而每一个dnsserver进程都可以执行单独的DNS查询,这样一来就大大减 少了服务器等待DNS查询的时间。

编译选项

./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]

在一些系统上,内建的内存分配机制(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。

--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是一个以逗号分隔的模块列表,例如:

[root@linux ~]#./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策略,你指定:

[root@linux ~]#./configure --enable-removal-policies=heap

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

[root@linux ~]#./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值是空的,但你能使用该选项来指定一个默认值。例如:

[root@linux ~]#./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库或头文件。假如它们不在默认位置,在该选项后指定它们的父路径。例如:

[root@linux ~]#./configure --enable-ssl --with-ssl=/opt/foo/openssl

在这个例子中,你的编译器将在/opt/foo/openssl/include目录中找头文件,在/opt/foo/openssl/lib中找库文件。

--enable-cache-digests

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

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

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

[root@linux ~]#./configure --enable-err-languages="Dutch German French" ...

--enable-default-err-language=lang

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

[root@linux ~]#./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缓冲如下:

[root@linux ~]#./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

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

--enable-pf-transparent

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

--enable-auth[=LIST]

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

[root@linux ~]#./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-ntlm-auth-helpers=LIST

使用该选项,你能将helpers/ntlm_auth目录的一个或多个HTTP NTLM验证辅助程序编译进来。

--enable-digest-auth-modules=LIST

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

--enable-external-acl-helpers=LIST

使用该选项,你能编译一个或多个扩展ACL辅助程序,例如:

[root@linux ~]#./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头。

--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()将文件大小设为零。这样做释放了分配给该文件的磁盘空间,但留下适当的目录接口。

--disable-hostname-checks

默认的,squid要求URL主机名在一定程度上遵守古老的RFC 1034规范:

标签必须遵循下列ARPANET主机名规则。它们必须以字母开始,以字母或数字结尾,仅仅包含字母,数字和下划线。

这里字母意味着ASCII字符,从A到Z。既然国际域名日益流行,你可能希望使用该选项来移除限制。

--enable-underscores

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

运行configure

现在我们准备运行./configure脚本。进入源代码的顶级目录运行./configure,后面跟上前面提到过的任意选项,例如:

[root@linux ~]#cd squid-2.5.STABLE4

[root@linux ~]# ./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使用哪个:

[root@linux ~]#setenv CC /usr/local/bin/gcc

[root@linux ~]#./configure ...

在./configure检查完该编译器后,它查找头文件,库文件和函数的长列表。通常你不必担心该部分。在某些实际情况 中,./configure会终止以引起你的注意,某些事情可能有问题,例如没有足够的文件描述符。假如你指定不完整的或不合理的命令行选项,它也会终 止。假如有错误发生,请检查config.log输出。./configure的最终任务是创造Makefiles和其他文件,这些文件基于squid从 你系统中了解到的知识。到此为止,你准备做编译工作。

编译

一旦./configure完成了它的工作,运行make开始编译源代码:

[root@linux ~]#make

正常来说,该过程很顺利,可以见到大量的滚动行。

安装

在编译完后,你需要把程序安装到指定的目录。

[root@linux ~]#make install

在安装完后,你将在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)。