Spiga

Google phone 系统详情

Google CEO曾经说过:手机应该免费使用。

Google于2005年购买了一个名为Android的公司,但是这家子公司的开发工作一直处于保密状态,根据我们消息透露, 目前Android正在开发一款专为手机设计的软件操作系统。

有消息透露,Google Phone有可能拥有如下特性:

  1.外观类似Blackberry

  2.采用C++ core w/ OS

  3.C++核心针对Java进行优化

  4.采用Skia的矢量图形系统

  5.提供包括VoIP在内的诸多功能

  Google近期在移动设备领域动作频频,Google Maps、GoogleSearch移动版功能不断增强,相信GooglePhone到来之日已为时不远。

十大最精典爱情短信

1) I love you not because of who you are, but because of who I am when I am with you.
我爱你,不是因为你是一个怎样的人,而是因为我喜欢与你在一起时的感觉。

2) No man or woman is worth your tears, and the one who is, won't make you cry. 没有人值得你流泪,值得让你这么做的人不会让你哭泣。

3) The worst way to miss someone is to be sitting right beside them knowing you can't have them.
失去某人,最糟糕的莫过于,他近在身旁,却犹如远在天边。 ��������

4) Never frown, even when you are sad, because you never know who is falling in love with your smile. 纵然伤心,也不要愁眉不展,因为你不知是谁会爱上你的笑容。

5) To the world you may be one person, but to one person you may be the world.
对于世界而言,你是一个人;但是对于某个人,你是他的整个世界。

6) Don't waste your time on a man/woman, who isn't willing to waste their time on you. 不要为那些不愿在你身上花费时间的人而浪费你的时间。

7) Just because someone doesn't love you the way you want them to, doesn't mean they don't love you with all they have.
爱你的人如果没有按你所希望的方式来爱你,那并不代表他们没有全心全意地爱你。

8) Don't try so hard, the best things come when you least expect them to. 不要着急,最好的总会在最不经意的时候出现。

9) Maybe God wants us to meet a few wrong people before meeting the right one, so that when we finally meet the person, we will know how to be grateful.
在遇到梦中人之前,上天也许会安排我们先遇到别的人;在我们终于遇见心仪的人时,便应当心存感激。

10) Don't cry because it is over, smile because it happened. 不要因为结束而哭泣,微笑吧,为你的曾经拥有。

Squid配置说明和流量限制

Squid 是一种源代码开放的高性能代理缓存服务器。它可支持FTP,gopher和Http数据对象的代理。另外,Squid也支持SSL,多样化访问控制和代理请求的完整日志功能。通过轻量级的网际缓存协议,Squid以网状或层次的方式分配内存,这样能节省额外的带宽。提供Http服务加速代理,Web服务器把Http数据推到Squid缓存中,外界的请求访问可以通过缓存提取所需数据,实现Web服务器的动态镜像。
另外,为了实现对Squid服务器的监控,采用MRTG。MRTG 是 Multi Router Traffic Grapher 的缩写,它主要的用途是监测网络服务设备的流量,并生成包括图片的HTML文件,可以直观的显示网络服务的流量,以提供Squid缓存服务的监测。
通过Squid+MRTG可以配置一个完善的代理服务提供方案。下面为具体配置步骤:
一.基础准备
Squid下载地址:http://www.squid-cache.org
版本:squid-2.4.STABLE4-src.tar.gz
MRTG下载地址:http://people.ee.ethz.ch/~oetiker/webtools/mrtg/pub/
版本:mrtg-2.9.22.tar.gz
机器配置为:256M内存,9G硬盘(其中4G分区专用缓存目录),PII433。

二.安装步骤
解压Squid(一般做法,把软件包括在/opt目录下)
#tar zxvf squid-2.4.STABLE4-src.tar.gz
#cd squid
//进行编译
#./configure –prefix=/usr/local/squid –enable-delay-pools –enable-snmp –enable-cache-digests –enable-auth-modules="NCSA"
#make all
#make install
*对编译项目的解释:
–prefix 为编译Squid所存放的目录,这里为/usr/local/squid
–enable-delay-pools 此选项使能一个延时池,这样能对某些特定的请求限制额定带宽。
–enable-snmp 此选项可以让MRTG使用SNMP协议对服务器的流量状态进行监测,因此必须选择此项,使Squid支持SNMP接口。
–enable-cache-digests 使能缓存摘要,本来此项目的是为了在Squid集群服务之间迅速发现缓存对象,这里在本地使用,可以加快请求时,检索缓存内容的速度。
–enable-auth-modules 此编译选项启用认证模块,可以对访问代理用户进行授权。

安装MRTG
#tar zxvf mrtg-2.9.22.tar.gz
#cd mrtg*
#./configure –prefix=/usr/local/mrtg-2
#make
#make install
/* 几点说明:
1.MRTG大部分程序是用Perl脚本写成,需要Perl版本为5.005以上才能运行,RH 7.2带有perl版本为v5.6.0,非常满足要求。(如果版本不够,请到www.perl.com下载安装。)
2. MRTG需要zlib,gd和libpng三个处理图形的库支持,RH7.2满足此要求。(如果没有安装,请到http: //www.boutell.com/gd/ http://www.libpng.org/pub/png/src/ http://www.gzip.org/zlib 下载安装)

三.具体配置
lSquid配置(仅对必要选项配置并说明):
http_port 80
此选项用于Squid代理所侦听的端口,由于要实现Http加速代理,则侦听端口80
tcp_outgoing_address 255.255.255.255
此句法指定了远程服务器的IP地址,这里我们使用255.255.255.255来指定为所有地址
tcp_incoming_address
这里可以使用http_port语法进行绑定端口和IP地址。表示客户端的请求。可以不使用。
cache_mem 64 MB
由于Squid在读写磁盘,I/O通道,数据转贮等需要大量内存,我们可以把内存值稍微设置大一些,这样可以提供服务器性能。

cache_swap_low 95
这用做表示缓存内部对象的替换的衡量基线。当交换分区的磁盘利用率超越这个基线,那么缓存对象替换也就随之开始。这里是用百分率做衡量标准。

cache_swap_high 98
此标记用于缓存对象替换的最高程度,当交换分区磁盘利用率接近此设置,则表示对象的更新程度更为剧烈。这里由于我的缓存区设置比较大,因此设置为98%。

下面几个配置标记采用系统默认配置。
{ maximum_object_size 4096 KB
{ 超过此尺寸的对象将不缓存。
{ minimum_object_size 0 KB
{ 小于此尺寸的对象将不缓存。
{ maximum_object_size_in_memory 8 KB
{ 内存中能缓存的最大对象尺寸。
{ ipcache_size 1024
{ 指定IP缓存大小。
{ ipcache_low 90
{ 缓存IP地址的最低基线。
{ ipcache_high 95
{ 缓存IP地址的最高极限。
{ fqdncache_size 1024
{ 缓存DNS全域名解析的尺寸。

cache_replacement_policy lru
此标记用于当缓存新对象时,使用缓存策略来清除缓存中特定对象。这里使用lru表示:它只替换长时间没有被访问过的对象。其他策略请参看配置文档介绍。

memory_replacement_policy lru
此用法同上,区别在于替换内存对象。

cache_dir ufs /cache 4000 16 256
设置缓存根目录为/cache,类型为ufs,缓存区大小为4G,可以有16个二级子目录,每有二级目录有256个三级子目录。

cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
cache_swap_log /var/log/squid/swap.log
上面几项是缓存日志记录的路径和文件名。

log_ip_on_direct on
记录客户端主机的IP地址。

log_fqdn on
记录全DNS域名解析。

mime_table /usr/local/squid/etc/mime.conf
Squid所用mime的文件路径

pid_filename /usr/local/squid/logs/squid.pid
Squid进程ID的文件。

ftp_user Squid@ynst.net.cn
这里可以使用匿名登陆FTP服务器。

ftp_list_width 32
FTP文件列表长度,超过长度则截断文件名。
ftp_passive on
允许主动连接FTP服务器。

dns_nameservers 202.98.187.1
指定代理的域名解析服务器。

authenticate_program /usr/local/squid/bin/ncsa_auth
/usr/local/squid/etc/passwd
代理认证程序,这里在/usr/local/squid/etc使用htpasswd产生一个密码文件,具体方法如下:
#htpasswd –cdb passwd auth_usr1 pass1
#htpasswd –db passwd auth_usr2 pass2
#htpasswd –db passwd auth_usr3 pass3
创建passwd文件,并添加auth_usr1,auth_usr2,auth_usr3三个认证用户。

authenticate_children 5
所需要要产生的认证进程数。

authenticate_ttl 3600
此标记设置认证保持时间。

authenticate_ip_ttl 1800
此标记设置认证绑定IP地址的时间长度。

authenticate_ip_ttl_is_strict on
此标记可在authenticate_ttl时间内,拒绝其他非认证IP地址访问。

request_header_max_size 10 KB
request_body_max_size 1 MB
设置了Http请求的包头和数据大小。

request_body_max_size 0
这里,请求所返回的数据大小为0,意义为没有任何限制。

connect_timeout 180 seconds
read_timeout 15 minutes
request_timeout 20 seconds
上面几项是代理服务几个超时设置,这里使用配置文件默认值。

下面是访问控制列表一些配置,这里对访问的IP地址,域名,访问类型极其访问代理的权限做的限制:
acl acldomain dstdomain .ynst.net.cn
acl acceleratedport port 80
acl acceleratedhost dst 202.98.187.17/255.255.255.255
acl aclprotocol proto HTTP FTP
acl aclmethod method GET POST

acl aclauth proxy_auth required
(注:这里使用required表示任何passwd文件中存在的合法用户才授予访问权限。)

acl aclsnmp snmp_community secrect
MRTG可以使用snmp协议检测此代理服务运行状态。

acl aclconn maxconn 20
可并行连接的最大数量。

启用定义的访问控制列表
http_access allow manager localhost
http_access deny manager
http_access allow aclauth
http_access allow acceleratedport acceleratedhost
http_access deny all

下面为缓存管理设置
cache_mgr admin@ynst.net.cn
设置缓存管理者的接受邮件地址。

cache_effective_user squidusr
cache_effective_group squidgrp
设置执行Squid的用户和用户组。
{注:设置用户和用户组及其权限修改方法如下:
#groupadd squidgrp
#useradd –g squidgrp –d /home/squidusr squidusr
修改log日志权限属性,使squidusr有写权限。
#chown squidusr /var/log/squid
#chgrp squidgrp /var/log/squid
#chown squidusr /var/log/squid/*.log
#chown squidgrp /var/log/squid/*.log
}

下面配置Http服务加速代理
httpd_accel_host 202.98.187.17
httpd_accel_port 80
httpd_accel_with_proxy on
(注:如果配置代理和加速服务,必须httpd_accel_with_proxy选项打开。如果需要配置多个加速,可以使用虚拟的概念。)

snmp_port 3401
此标记设置snmp_port端口为3401,可以使MRTG监测服务运行状态。

snmp_access allow aclsnmp localhost
snmp_access deny all
snmp_incoming_address 0.0.0.0
snmp_outgoing_address 0.0.0.0

以上选项用于配置和MRTG交互信息的Snmp设置。

digest_generation on
digest_rebuild period 1 hour
digest_rewrite_period 1 hour
digest_swapout_chunk_size 4096 bytes
digest_rebuild_chunk_percentage 10
产生缓存摘要,并设置摘要重构所需要的时间及其相关设置,这里采用系统默认设置。缓存摘要使的庞大的缓存内容形成一个微型检索,提高代理性能。

最后我们进行延迟队列池进行配置
延迟队列池可以基于一定规则对特定请求数据的进行限制,这样可以防止恶意用户发送非正规数据串攻击服务器。
以下选项只在必要处进行说明,配置如下:
delay_pools 1 #定义一个�
delay_class 1 1 #池为1类型
delay_access 1 allow all #允许类型1的所有请求访问
delay_parameters 1 128000/128000 #限制访问的128k/s
delay_initial_bucket_level 50 #Squid启动时,初始化池所用的带宽数量。

运行Squid代理服务:
#squid –z /*创建Squid所使用的缓存目录结构
如果想在前台运行
#squid –NCdl
如果想在后台运行
#squid
检查Squid是否运行
#squid –k check

lMRTG配置:
首先测试SNMP服务是否启动:
#snmpwalk -p 3401 hostname communitystring .1.3.6.1.4.1.3495.1.1
如果看到如下输出:
enterprises.nlanr.squid.cacheSystem.cacheSysVMsize = 7970816
enterprises.nlanr.squid.cacheSystem.cacheSysStorage = 2796142
enterprises.nlanr.squid.cacheSystem.cacheUptime = Timeticks: (766299) 2:07:42.99
则说明SNMP正常工作。
按照mrtg.hdl.com的文档,使用cfgmaker和indexmaker就可以生成MRTG所需要的Web发布文件。使用cfgmaker可以创建配置MRTG所需要的配置文件,而Indexmaker则是检索MRTG生成的Web文件,制作一个Index.html。这里,我提供一种更为简洁的办法:
(感谢Chris提供的mrtg-squid.cfg文件和index.html,可到http://www.psychofx.com/chris/unix/mrtg/ 下载这两个文件。)
修改mrtg-squid.cfg文件选项如下:
修改 WorkDir 和 LoadMIBs 路径设置
修改所有出现在文件中的"hostname" 为你实际服务器名字
修改所有 "chris"字段为你需要的名字和地址
修改community 字串属性
这里配置如下:
WorkDir: /home/www/mrtg/squid
LoadMIBs: /usr/local/squid/etc/mib.txt
所有public@hostname修改secrect@proxysvr

创建/home/www/mrtg/squid这样一个目录。
#mkdir /home/www/mrtg/squid
#cd /home/www/mrtg/squid
#cp /opt/mrtg-squid.cfg .
#mrtg mrtg-squid.cfg
#cp /opt/index.html .

修改/etc/httpd/conf/httpd.conf如下几个选项
Listen 8000
Port 8000
Documentroot /home/www/mrtg/squid

由于mrtg读取文件需要资源,因为合理设置读取间隔,这里我设置为5分钟:
crontab –e
*/5 * * * * /usr/local/mrtg-2/bin/mrtg /home/www/mrtg/squid/mrtg-squid.cfg

这样,我们就建立了一个完善的代理加速访问服务器,通过mrtg的强大监控,可以统计服务器运行时设备运行状态。由于以上软件遵从GNU,因此一种强大而有经济的建站手段。通过认证控制,允许特定用户使用代理服务。而Web加速服务器则成为服务器镜像的方便手段。

Proxy Server 架设


简易 Proxy Server 架设


代理服务器的功能可多的呢!在中大型的企业当中,可以藉由单点对外的 Proxy 主机来达到『节省频宽』的目的,同时,也可以透过这样的 Proxy 架构来达成『高阶防火墙』的设定,这里的『高阶』指的是 OSI 七层协议里面比较高阶段的层级,那就是应用与表现层方面的防火墙啦!那如果对于小型的企业呢?这个 Proxy 也可以达到分流的作用,让不同的目标网站可以透过不同的上层 Proxy 来取得数据!啊!真是很不错的一个服务器啊!不过,这个 Proxy 服务器也是几个常见的服务器里面,硬件要求相对比较高的一个咚咚!因为 Proxy 要求的是『快速』,所以呢,呵呵!当然硬件等级的要求是相当的『蛮像一回事』的!^_^

 


原理: 
    代理服务器的原理其实很简单啦!就是以类似代理人的角度去取得使用者所需要的数据就是了!但是由于他的功用,使得我们可以透过代理服务器来额外的达成防火墙的功能!此外,也可以藉由代理服务器 ( Proxy ) 来达成节省频宽的目的,以及加快内部网络的 WWW 存取速度!总之, Proxy 对于大型的企业来说,实在是一个很不错的东西啊!
     

    什么是代理服务器
     
    在真实世界中,我们或许会帮忙家人去办理一些杂务吧!举个例子来说,例如缴费或者是申办提款卡等等的,那么由于你并不是『申请者本人』而是『代理人』的角色,因此有时候会需要秀出一些证件就是了。那么在网络上面的代理服务器是怎么回事呢?他就是 Proxy Server 啰!他最主要的功能就如同我们上面提的真实世界一样, Proxy 会帮 Client 端的用户去向目的地取得客户端所需要的数据 。所以,当 Client 端指定代理服务器之后,您的所有相关要求( 例如 WWW 的要求 )就会通过代理服务器去捉取啰!整个代理服务器与客户端的相关性可以由下图约略看出一个端倪:  

    图一、代理服务器的示意图
    在内部的计算机都是透过 Proxy 来向 Internet 求取数据的,这就是所谓的『代理服务器』啦!当然,上面的架构仅只是一个案例,还有相当多的非 Intranet 的 Proxy 架构,亦即是你的 PC 与 Proxy 均在 Internet 上面,但是您一样可以透过这个 Proxy 来帮您达到代理人身份的目的呢!
     
    在 Proxy 与 Client 的相关性当中,您必需要了解的是:您向外部要求的资料事实上都是 Proxy 帮你取得的!怎么说呢?举个例子来说,假如我在我的浏览器 ( 假设是 Netscape 好了 )设定了我们学校的代理服务器主机 proxy.ncku.edu.tw 做为我的 Proxy 好了,再假设我的 IP 是 140.116.44.125 ,那么当我想要取得奇摩网站的新闻信息时,事实上,都是 proxy.ncku.edu.tw 帮我去取得的,所以在奇摩的网站上面看到向他要求资料的人是谁呢?呵呵!当然就是 proxy.ncku.edu.tw 而不是我 140.116.44.125 啰!这样可以了解 Proxy 的功能了吗?
     
    除了这点功能之外, Proxy 还有一个很棒的额外功能喔,那就是防火墙的功能!怎么说呢?看一下上面的图示,您可以发现一件事情,那就是 Client 端的个人计算机要连上 Internet 一定要经过 Proxy 服务器,并且,如果有人想要入侵你的系统时,由于你的 proxy 在最外部啊,所以攻击者就会攻击错方向,如此一来,不就比较安全!此外,由于整个 Intranet 对外都是经过 proxy ,也就是『单点对外』的情况,这种状态底下要来管理防火墙也是比较简单的喔!^_^
     

    代理服务器的运作方式
     
    了解的 Proxy 的功能之后,我们来谈一谈那么 Proxy 到底是怎样运作的呢?为何他会有『加快网络存取效率』的情况?这就必需要以底下的图示来说明了!
     
    图二、代理服务器的运作方式流程图 
    当 Client 端设定了代理服务器之后,在 Client 端想要取得 Internet 上面的信息时,他是这样取得数据的 (注:那个 Cache 表示为 Proxy 主机的硬盘的意思 ):
     
    一、Proxy 有使用者预计要求的数据时( Step 1, 2, 3,4 ): 
    1. Client 端向 Server 端发送一个数据需求封包;
    2. Server 端接收之后,先比对这个封包的『来源』与预计要前往的『目标』网站是否为可接受?如果来源与目标都是合法的,或者说,来源与目标网站我们的 Proxy 都能帮忙取得资料时,那么 Server 端会预计开始替 Client 取得资料。这个步骤中比较重要的就是『比对政策』啦,有点像是认证的感觉啦;
    3. Server 首先会到自己的硬盘里面,也就是所谓的 cache (快取) 查看一下有没有 Client 端所需要的数据,如果有的话,那就将数据直接送到 Client 端 (步骤4) 而不经过向 Internet 要求数据的程序;

     
    二、Proxy 没有使用者预计要求的数据时 ( Step 1, 2, 3, 5, 6, 2, 3, 7 ):

    1. 在经过 1, 2, 3 查寻知道 cache 没有数据,或者数据过期之后, Proxy 会向 Internet 上面的目标网站要求数据;
    2. 在将资料取回之后, proxy 会先将取得的数据『储存一份到 cache 当中』;
    3. 最后才将数据传回给 Client 端使用。

     
    整个 Proxy 的工作流程就是这个样子,所以,我们就可以知道的是, Proxy 对于 cache 的速度是很要求的,而这个 cache 就是硬盘啦!当然,硬盘容量必需要足够大,而且还要『足够快』才行!因为由上面的流程当中,我们不难发现, Cache 是一直被重复存取的一个地方喔!所以硬盘的好坏就差别很大啦!可以说他是影响一个 Proxy 效能好坏的关键点呢!
     


    代理服务器的用途与优缺点
     
    一般来说,代理服务器的用途主要有两个:
     �
  • WWW 网页代理人:最主要的用途当然就是做为网页数据取得代理人啰,也就是说, Proxy 可以帮我们取得 Internet 上面的 WWW 数据就是了!那么能不能取得其它非 WWW 的资料呢?那就不一定了,要看 Proxy 主机是否有设定该服务。一般来说, Proxy 主要还是针对 WWW 网页的代理取得;

 

  • 做为 Intranet 的单点对外防火墙系统:就如同前面的图示, Proxy 如果架设在 Intranet 对外的连接点上面,那么他就可以被用来做为『应用层』阶段的防火墙了!而且,这个时候不需要设定 NAT 就可以让 Intranet 内部的私有 IP 的计算机连接上 Internet 了!这是因为您想要的数据是向 proxy 要求,所以真正去取得数据的人是『Proxy』而不是你的计算机啊!所以,只要 Proxy 可以接受私有 IP 的计算机要求,那这些私有 IP 的计算机就可以连上 WWW 啦!不过,也由于 Proxy 为一个 应用层 阶段的防火墙系统,所以,他并无法进行较低阶的封包过滤!因此,在内部计算机想要透过 Proxy 来取得邮件、或者是其它的服务,呵呵!那就比较麻烦,简直就是麻烦的多啦!

 
由于 Proxy 的这种特性,让他很常被使用于大型的企业内部,因为可以达到杜绝内部人员上班时使用非 WWW 以外的网络服务,而且还可以监测使用者的资料要求流向与流量呢!很不错吧! ^_^好了,接下来我们来谈一谈 Proxy 主要的优缺点吧:
 

  • 快速的存取动作:一般来说, Proxy 主机的频宽以及硬件配备会比较高档!所以 Proxy 最大的优点就是可以提供客户端较为快速的浏览!咦!但是我们向 Proxy 要求数据的时候, Proxy 不是会自行再储存一份吗?这样不是会多花很多时间?是这样没有错,但是,换一个角度来想,如果在第一位使用者要求过 A 数据后,由于 Proxy 就会自动放一放 A 数据在 Cache 当中,之后的所有使用者只要是重复要求这个 A 数据, Proxy 可以立刻将数据传给使用者 ,您瞧!这样这个 Client 等于是直接向 Proxy 取得这份 A 资料了!是否更加的快速!这是因为 Proxy 就在您的 Intranet 之内,传输速度可是相当快的!这也就是说:如果您要设定代理服务器的时候,一定要找距离我们的机器最近的那一部,否则就没有达到代理服务器的功用了!通常快速的存取动作最明显的大概是连去国外的网站了!这里要强烈的建议, 如果你需要连上国外的网页,请一定使用代理服务器,因为不但可以节省频宽,并且速度上会快上很多很多 ( 例如美国环保署, EPA 网站! )

 

  • 降低网络的负荷:由于我们是向代理服务器要求数据,如果代理服务器内刚好有你要的数据,将会直接传给你,则你的要求将不会到真实的那一个网页去 ( 除非你在 IE 内按下『重新整理』这个按钮 ) ,而如果没有你要求的数据,那他也会去捉一份你要的数据给你,并存下来,以后如果有与你相同需要的用户,那他就可以直接传送给用户,如此当可降低网络的负荷!(也就是上面 图二的 step 1, 2, 3, 4 )

 

  • 资料分流:由于各家 ISP 对于不同国家的频宽是有差异的,因此,假设如果您要去美国时使用 Proxy1 速度较快,而 Proxy2 则是去日本比较快,至于台湾本地则 Proxy3 较快,如此一来,我们可以透过设定将不同目标的代理服务器分开来,以达到分流的目的!则你的网域中将可以达到很好的分流效果,网络『感觉上』会比较快速喔!

 

  • 提供防火墙内部的计算机连上 Internet:这个是一般企业比较常用的情况!由于企业内部害怕被黑客侵入,通常会设立一些比较严密的防火墙,然而如此一来公司内部的计算机可能面临无法连上 Internet 的窘境,那使用 proxy 让你的内部计算机可以透过这一架主机的代理服务而取得 Internet 上的信息,就是一个很好的方法啦!

 

  • 多层次的管道 ( 上层代理服务器 ):代理服务器可以提供多重的管道设定,例如,当你需要国内的数据时,代理服务器将直接去捉取,而需要国外的数据时,才连到上一层的代理服务器!如此将可达到你的需求 ( 而不用常常在你的 IE 等浏览器上更改所需的代理服务器 ) ,这个部分我们在底下还会进行额外的说明。

 
有利就有弊,当然 Proxy 也不是万能的天神~他有什么可能潜藏的缺点呢?
 

  • 容易为 Intranet 的内部人员滥用:因为 Proxy 是对内部的计算机捉取数据 ( 当然也可以对 Internet 上面的使用者捉取数据啦! ) ,而且在 Internet 上面看到的实际上是你的 Proxy 在捉资料喔!如果你的使用者大量的以浏览器下载 A 图啊,还是透过你的 Proxy 干坏事啦,这样一来可就累了~因为实在不容易轻易的管理!所以,为了杜绝这个状况,强烈的建议多加安装登录档案分析的软件,在管理上面会轻松很多喔!

 

  • 需要较高超的设定技巧与除错程序:在鸟哥设定过的 Server 当中, Proxy 算是比较不容易设定好『效能』的一个服务器了!由上面的传输过程中,您不难发现 Proxy 的 Cache 与他的『上层代理服务器』的关系是很紧密的,万一设定错误的话,很有可能反而让您的 Proxy 拖垮 WWW 的浏览速度!最严重的是造成无法联机 ( 在上层 Proxy 与您的 Proxy 之间构成 loop 而跑不出去! ),因此,这对于管理员来说是比较困扰的一件事。

 

  • 可能会取得旧的错误数据:由前面的 Proxy 运作过程当中不难发现,Client 端向 Server 端求取资料时,Server 会先向自己的 cache 查寻,如果有该索求数据,就立即将数据送给 Client 。现在假设个例子来说明,万一我的网页三天两头改变一次,那么那个 cache 事实上并没有天天更新啊!这个时候, Client 端所取得的数据就有可能是网页修改之前的旧数据咯!所以,使用者得常常按下『更新』才能取得新的资料啊!

 
总之, Proxy 的优点是很多的,但是缺点却需要网管人员的操心啊!
 


什么是上层代理服务器?哪里有上层代理服务器
 
什么是上层代理服务器:
好了,上面提到过所谓的『上层代理服务器』这又是什么咚咚?事实上,上层代理服务器就是一个 Proxy 啦,只是,我们自己设定的这个区域 Proxy 会将自己当作 Client 而去要求另外一个 Proxy 求取数据来给我们的使用者就是了!整个流程图可以这样看:
 
图三、上层 Proxy 示意图 
就是我们的 Local proxy 并不会主动的去捉数据,而是透过『上层代理服务器』去向 Internet 要求资料!这样有什么好处呢?刚刚上面也曾经提过了,由于这些上层代理服务器才是真正对外频宽最大的几部机器之一,所以透过他来要求数据一定又比我们的 Local proxy 还要来的快啊!所以我当然会喜欢设定上层 Proxy 噜!这个现象最常发生在对国外的联机上面,有没有设定 Proxy 差异是相当大的呢!上层代理服务器除了频宽更大之外,还有没有什么好处啊?当然有,最大的好处就是达到分流的效应!例如下图的说明:
 
图四、上层代理服务器的分流动作示意图 
我总共设定了三个上层代理服务器,由于这三个代理服务器对外的速度都不相同,所以,当我要去美国时,就以 Proxy1 来要求资料,要连欧洲就以 Proxy3 ,至于要连日本,就以 Proxy 2 来要求我所需要的数据,如此一来,呵呵!可以让我的 Proxy 达到最佳的效能喔!很不错吧! ^_^!所以上层代理服务器是很重要的呢!
 
哪里有上层代理服务器?
目前有哪些流量大、然后又开放出来的 Proxy 呢?我这里举几个网页给大家参考参考:
  

 
由前面的介绍中,我们不难发现 Proxy 有可能会被 Client 端过度的滥用,同时也有可能会被拿来为非作歹啊!所以,目前绝大部分的 Proxy 已经『停止对外开放』了,仅针对自己的网域内的 Client 提供 Proxy 的服务而已~因此,如果您要自行设定 Proxy 的时候,请记得去您当初申请网络的 ISP ( 如果是学术单位,就到上面介绍的学术网络查看看即可!) 查寻一下,才能比较有效的设定好您的主机喔!因为设定错误的话,呵呵!上层 Proxy 根本不提供服务,或者是上层 Proxy 的效能并不好,那个时候您的 Proxy 也会连带的受到很大的影响啊!慎选!慎选!
 


我是否一定要设定 Proxy ?
 
话又说回来,到底我应不应该设定 Proxy 呢?还是得由理论与实际上的状态来进行说明。事实上,我们的 Proxy 感觉上会加快传输的速度,主要的因素是来自于 cache 已经记录了一份数据了,所以 Client 端取得的其实是这一份资料,而不是真的来自于 Internet 上面的实时数据!这样的好处前面提过了,就是可以增加内部网络传输的效能啊!但是,这要在一个前提之下,就是我的使用者很多时,那么由于来自四面八方的人会四处去求取资料,让我的 Cache 拥有较大的数据库,那么内部传输的速度自然就会有所帮助!所以,要架设 Proxy 的情况可以是:
  
  • 我的 Client 端用户不少,而且大部分仅需要 WWW 这个网络服务而已;
  • 我的 Proxy 还兼做防火墙的任务;
  • 我的 Client 端常常需要联机到传输速度很慢的网站,例如国外的网站;
  • 我的 Client 端常常浏览的网站是『静态』网站,而不是动态网站(例如讨论区的 PHP )。

 
相反的来说,要是 (1)我的 Client 端很少,那么每次上去 WWW 都是求取新的资料,有没有 Proxy 反而看不出效益~此外,(2)Proxy 由于属于应用层了,对于 Internet 的规划上弹性较不足!不像 NAT 主机可以进行很多的功能!(3)我常常上的网站是类似讨论区那种一日多变的网站,在这样的情况下,实在是没有必要架设 Proxy 的!
 
但是,如果对于学校单位那原本频宽就不足的环境中,架设 Proxy 来让校内的网络速度提升,呵呵!就是有那个必要性的啦!所以要不要架设 Proxy 呢?请好好的依据您的环境来考虑喔!
 


所需要的硬件要求与最佳硬件配置方式
 
假设您一定需要架设 Proxy ,那么到底什么样的配备是必需的呢?我们刚刚提到 Proxy 对于硬件的要求相当的高!因为我们架设 Proxy 的目的就是希望能够加快网络的传输效能嘛!因此,虽然 Proxy Server 几乎在任何的 Linux 系统上面都能跑 ( 例如我的 P 133 MMX ) ,但是您的 Proxy Server 最好还是能有以下的硬件等级:
  
  • CPU 最好能够 P III 550 以上等级;
  • RAM 最好能够大于 512 MB ,这也是很重要的一个硬件参数!
  • Hard Disk 最好能用 SCSI 接口的,因为速度与稳定度都比较好!如果不能的话,那么 IDE 接口的硬盘由于目前速度也越来越快,所以使用 IDE 也没有问题,但是最好是『多颗硬盘』的架构,例如我总共需要 30 GB 的硬盘空间,那么最好是 10 GB 的硬盘三颗这样的架构较佳!为什么呢?由于 cache 对于 Proxy 的重要性相当的大,所以 cache 读取速度越快的话,代表 Proxy 的效能也会越好!那由于 Proxy 对每笔资料写入 cache 时,是『平均分摊在各个 cache 的目录中 』,所以当然硬盘数越多越好啰!例如我原本有 10 MB 的数据要写入 cache ,那么这 10MB 写入同一颗硬盘快?还是 10MB 被分散写入三颗硬盘,因此每一颗硬盘仅记录 3.3MB ,那一个快?当然是三颗硬盘的架构会比较快,因为我有三个磁头在帮我写入数据嘛!^_^!请注意喔! 这里我们说的是『多颗硬盘』而不是『多个 Partition 』喔!因为如果我将 30GB 的硬盘切割成三块 partition 的状态下,由于还是只有一个磁头啊,所以写入的速度差异不会很大!这里要特别留意与了解呢!
  • 网络卡与网络周边最好使用 GBytes 的网络卡,当然啦,一般的公司行号应该不需要用到这样的网络卡才是!我这里指的是较高档的配备啦!

 
事实上,最重要的还是 RAM 与 HD 这两样,当然,网络接口也绝对不能忽视就是了!针对硬盘来说,最好使用 SCSI 这个稳定的接口,当然,使用 IDE 也是不错啦!但是要注意保养就是了。此外,就如同上面提到的,在硬盘的架构上是相当的重要的!一般来说,使用磁盘阵列应该是不错的想法,如果没有办法的话,使用多颗硬盘取代单颗硬盘的架构,在效能上也会有不错的显著提升呢!
 
既然硬盘这么重要,我们也约略谈一谈硬盘的基础规划应该有哪些需要注意的呢?
 

  • 最好在架设 Proxy 时,将整体主机的规划做好,并且让 Proxy 主机的服务简单一点,就是仅负责 Proxy 就好了!
  • 每颗硬盘的容量不需要太大,大约在 9 GB 以内即可,此外,最好将硬盘分割一下,一块 Partition 差不多在 2~4 GB 之间即可,因为切太大的话数据的搜寻耗费时间较长,但是 Partition 太小又可能造成空间的浪费~所以差不多的大小就限制在 2~4 GB 吧!
  • 我们刚刚上面有提过,cache 是放置在某个目录下的,而最好一个目录底下就是独立的一个 partition 。此外,由于 cache 所在的硬盘常常会有数据的存取,因此可能此一硬盘的损耗率会比较大,所以这个 cache 所在的硬盘最好不要跟重要数据文件,例如 /, /etc, /usr, /home 等等重要的系统档案放在一起,以免危险啊!
  • 也由于 cache 所在的硬盘数据存取太密集了,所以,硬盘的选择上面需要 (1)转速不能太低; (2)磁头的机械臂需要可以忍受频繁的动作; (3)发热量不可太大,或者可以考虑加装硬盘用风扇。

 


代理服务器与 NAT 主机的差异
 
或许您已经发现了一件事,那就是:在内部局域网络使用私有 IP 的 Client 端不论透过 Proxy 或者 NAT 均可以直接取得 WWW 这个 Internet 的服务,那么 NAT 与 Proxy 有没有什么不同的地方啊?他们不都是可以让内部的 Client 连接出去吗?其实这两个玩意儿差异性是『相当大』的:
  
  • NAT 是一个利用 TCP/IP 的 packet filter ( 封包过滤机制 )来进行封包处理的一个机制,所以他是『直接分析 TCP/IP 』,所以在设定防火墙的时候,他的弹性比较高,只要能过 NAT 这一关,那么大部分的网络服务都可以使用,因为 TCP/IP 是比较底层的协议啊!要知道的是,TCP/IP 上头还有 port 、还有 IP 等等的信息,单是 port 就可以让我们使用很多的不同的协议了!例如 port 20, 21 是 FTP 啊, 80 是 WWW 啊等等的!所以 NAT 能做的事情事很多的!

 

  • 至于 Proxy 就不一样了, Proxy 主要透过类似 Squid 这一类的软件来达成的一个服务,基本上,一般来说他是透过 port 3128 来进行数据的监听与传输,单是看到这个 port 3128 就应该要晓得他仅是一个 daemon 而已。Proxy 已经是应用层这个阶段的网络项目了,所以他并没有去分析 TCP 的封包,只要 Client 来源合乎他的需求 (例如 IP 是被支持的 ) ,那么他将透过 daemon 的功能帮使用者达成使用者所想要的任务!所以说,能不能做某些事情,与 Proxy 服务器上面负责的那个 daemon 是有关的!万一 daemon 无法进行 FTP 数据的取得,那么您再怎么努力的尝试上网也是枉然的啊!

 
这样说有没有比较有点概念了呢?NAT 是由较底层的网络去进行分析的工作,至于通过 NAT 的封包是干嘛用的, NAT 不去管他!至于 proxy 则主要是由一个 daemon 的功能达成的,所以必需要符合该 daemon 的需求,才能达到某些功能!
 
谈完了这些基本的原理之后,我们可得来玩一玩 Proxy 了吧?!事实上,目前有很多的 Proxy 软件,例如 apache 也有提供 proxy 模块的功能喔!但是,最好不要用 Apache 当作您的 Proxy server ,因为…..效能真的太差了~会让您的网络停顿的更厉害~目前 Proxy 的服务器软件当中,以 squid 这个咚咚最出名,会出名的原因是因为他的效能高!真的很不错的一套软件,所以底下我们就针对 squid 来做说明吧!


套件安装 
    我们的 Proxy 服务器软件选择 squid 这个效能很高的套件来安装,目前 ( 2003/03 ) Squid 已经出到了 2.5 版了,您可以到官方网站上面下载,或者是到中山大学的 FTP 网站上面下载,底下提供一下联系的网址:
     �

 
同样的, squid 也有两种主要的安装模式,分别是 RPM 版本与 Tarball 版本,不过,由于我们会加入一些不同的参数设定值,所以预设的 RPM 档案并无法满足我们的需求,除非使用 SRPM 来进行重新 configuration 的动作,否则比较不能让我们满意啦!因此,习惯上我们都是以 Tarball 的方式来进行编译、设定与安装,所以底下鸟哥会比较偏重以 Tarball 的安装来进行介绍,如果有兴趣的话,可以尝试以 SRPM 进行修订的工作喔!
 


使用 RPM 方式安装 squid
 
一般来说,使用您的 Linux distribution 提供的 Squid 也就够了,但是,就如同上面提到的,可能会有一些设定值您无法自由自在的设定,不过。不过,无论如何,以 RPM 来安装是最简便的啦!那么就请拿出您的原版光盘,将他 Mount 上来,查询一下是否有 squid 字样的文件名称?没错,就将他安装上去吧!目前主要的几个 distribution 都有提供这个套件,所以应该可以很快的找到这个套件才是!怎么使用 RPM 呢?没这么难吧!
  
[root@test root]# rpm -ivh squidxxxxxxx

 
一再地强调, RPM 是粉重要的,请好好的使用他吧! ^_^!这个指令就安装完毕啰!只是要注意的是,由于 squid 2.2 版以前的设定与 2.4 版以后的设定差异性很大,所以请特别留意您的 squid 版本,如果是使用旧的 Linux distribution 的使用者,例如 Red Hat 6.xx 版本,或者是 Mandrake 7.xx 版本,那么就不要再以 RPM 来升级了!直接使用底下的 Tarball 吧!反正才安装一个档案,还不会太难啦!
 


使用 Tarball 方式安装 squid
 
一般来说,我还真是蛮喜欢中山大学的 FTP 站 ( 怪了,好像一直在帮人家打广告! ^_^ ) 没办法,我们南部人嘛!当然是南部的 FTP 站比较亲切啰!这个时候,您可以直接在 Linux 底下使用 wget 来取得我们所需要的 squid 喔!目前我取得的版本是 2.5.STABLE2 版本,取得的方法如下:(注:您也可以到鸟哥的私房菜下载 http://linux.vbird.org/download)
  
[root@test root]# wget \
http://ftp.nsysu.edu.tw/Unix/Proxy/squid/source/STABLE/squid-2.5.STABLE2.tar.gz

 
好了,这个档案应该就是 /root/squid-2.5.STABLE2.tar.gz 啰!那么就开始来给他安装吧!过程很简单啦,重要的地方只有在下达 ./configure 的地方需要很多的额外参数支持就是了!
 

0. 解压缩:
[root@test root]# cd /usr/local/src
[root@test src]# tar -zxvf /root/squid-2.5.STABLE2.tar.gz
# ….(略)….会产生一个 squid-2.5.STABLE2 的目录
[root@test src]# cd squid-2.5.STABLE2
 
1. 开始设定参数:
[root@test squid-2.5.STABLE2]# export CFLAGES='-O2 -mcpu=i586′
# 这是一个额外的参数啦!因为我们使用的是 Linux ,而我们的 GNU gcc
# 有针对每种不同的 CPU 来进行套件的最佳化编译!所以啦,就加入我们的
# CPU 型号吧!因为我的 CPU 是 P-166 ,反正是个小案例啦!所以才会是 i586,
# 您的 CPU 只要超过赛扬等级以上,就会是 i686 啰!此外,除了
# i386, i486, i586, i686 还有 pentium, pentium3, pentium4, athlon,
# athlon-tbird, athlon-4, athlon-x, athlon-mp, k6, k6-2, k6-3 等等!
# 如果不确定您的 CPU 那么就用 ix86 之类的方式来命名吧!不过,即使没有
# 写入这个参数也无所谓啦!至于那个 O2 是最佳化参数啦!
 
[root@test squid-2.5.STABLE2]# ./configure –prefix=/usr/local/squid \
> –enable-gnuregex –enable-async-io=80 –enable-icmp \
> –enable-kill-parent-hack –enable-snmp \
> –disable-ident-lookups –enable-cahce-digests \
> –enable-err-language="Traditional_Chinese" \
> –enable-poll –enable-linux-netfilter
# 这个咚咚就有趣啦!因为实在有相当多的参数可以使用,你可以使用
# ./configure –help 来察看可以使用的许多参数啊!稍微解释一下各个设定值:
–prefix=/usr/local/squid未来程序编译完成后放置的安装目录;
–enable-gnuregex:使用 GNU 提供的正规表示法的原则来进行编译,请注意,
  因为在 Proxy 未来的规划当中,很可能会动用到正规表示法的方式来
  抵挡一些恶意的网站,所以这里应该要加入这个参数的!
–enable-async-io=80这个项目主要在控制一些输出入的组件,使用这个项目
  可以让您的 Proxy 效能提升很多喔,因为是异步输出 (async) 的模式啊!
  后面接的数值是可以变动的,如果您的网站配备很高档,可以尝试将这个数字
  提升到 160 以上,如果是小网站的话,那么可以考虑将他降低至 40 左右。
–enable-icmp要不要支援 ICMP 啊!当然是要的!
–enbale-kill-parent-hack在我关掉 squid 的时候,要不要连同
  parent process 一起关掉,当然也是要的啦!
–enable-snmp这个与制图的 MRTG 比较有关啦!如果没有用到的话,
  可以考虑将这个项目拿掉也没有关系!
–enable-cache-digests这个项目很重要的啦,我们在底下再进行说明。
–enable-err-language="Traditional_Chinese"不需要写了吧?
  只要有任何的错误讯息,网页上面显示的语系会是中文喔!
–enable-poll可以提升效能;
–enable-linux-netfilter可以增加通透式 Proxy 的设定!后面再提啦!
 
2. 开始编译以及 Install 啰!
[root@test root]# make && make install
 
3. 开始设定其它的相关参数
[root@test root]# vi /etc/man.config
# 在这个档案当中新加入一行:
MANPATH /usr/local/squid/man # 与 Squid 有关的 man page
# 可以让 squid 提供的说明文件让 man 指令可以查到!

 
就这样几个简单的步骤就将 squid 给他安装完毕啦!很快速吧!所以我说,使用 Tarball 来安装 squid 其实是很快的,不用太担心啰!


Server 端设定: 
    终于来到了主机端的设定项目啦!以下我们会分门别类的介绍各个主要的参数值,这些参数不见得适合您的 Proxy 环境,所以使用的时候敬请特别小心喔!每个项目都要好好的了解一下吶!另外,底下我主要是以 Tarball 安装的目录为主要的介绍状态,如果您是以 RPM 来安装的话,那么所有的档案原理与设定还是一样的,只不过档案存放的路径就不太一样就是了!请以 RPM 的指令或者是 locate 与 find 的方式找出来您的设定档吧!
     

    squid 的结构
     
    刚刚安装的目录其实是在 /usr/local/squid 这个目录下,而这个目录又分为几个主要的子目录,分别为:
     
  • bin/ :放置主要的 squid 执行 scripts 的目录,重要的是 RunCache 那个档案;
  • etc/ :几乎所有的 squid 设定档都在这里;
  • libexec/ :一些函式库;
  • man/ :就是一些在线文件查寻档啦!
  • sbin/ :重要的就是那个 squid 的执行档!
  • share/ :一些错误讯息代码表示档案,以及一些小图标放置的目录;
  • var/ :预设是放置 log file 的,不过我不喜欢放在这里,这点等一下我们会修改的!

 
那么主要的设定档有哪些呢?其实可以说只有两个啦:
 

  • /usr/local/squid/etc/squid.conf :这个是主要的设定档,所有的 squid 所需要的设定都是放置在这个档案当中的!鸟哥底下提到的种种设定方法几乎都是这个档案里面的说明喔!所以,如果您英文不错,那么就直接看一下这个档案就知道如何设定 squid 啦!
  • /usr/local/squid/etc/mime.conf :这个档案则是在设定 squid 所支持的 Internet 上面的档案格式,就是所谓的 mime 格式啰!一般来说,这个档案的预设内容已经能够符合我们的需求了,所以不需要更动他,除非您很清楚的知道您所需要额外支持的 mime 档案格式。

 
而执行档其实只有一个,那就是 squid 啦!不过, Squid 这个套件额外的提供了两个可执行的 scripts 来帮助大家执行 squid ,那就是在 bin/ 里面的 RunAccel 与 RunCache :
 

  • /usr/local/squid/sbin/squid :就是我们说的 squid 的执行档啰!要知道这个指令的参数吗?就使用『 ./squid –help 』就能知道有什么参数啦!
  • /usr/local/squid/bin/RunCache :这个是主要的执行 squid 的一支简单的 script ,主要是利用 squid.conf 设定档案的内容来启用 squid 喔!
  • /usr/local/squid/bin/RunAccel :如果您的 WWW 服务也想要透过 Squid 来进行『加速』的话,那就可以使用 RunAccel 来取代 RunCache 了,不过,我通常还是使用 RunCache 而已!

 


squid 的 process owner 与 cache directory owner
 
我们前面的原理部分稍微提过, squid 主要是以 daemon 提供的 Proxy 功能,而这个 daemon 最大的功能就是将 Internet 上面捉取的数据给他放入 Cache 目录当中啦!而由于 daemon 会产生一些 processes ( 程序 ),这些程序都会有 Owner 以及 Group 。这样晓得我要讲什么了吧?呵呵!没错,那个放置 cache 的目录 ( 底下简称 cache dir ) 的拥有者以及拥有群组就必需要与 squid 产生的 process 的拥有者与群组相同才行!而为了保险起见,通常 squid 不会以 root 来启动,最好是以 nobody 或者是一些权限比较低的系统账号来启动他!假设我们的 squid 这个 daemon 是由 nobody 所启动的好了,而假设我的 cache dir 是放置在 /var/spool/squid 下面,则这个 /var/spool/squid 的 Owner 与 group 就必需要是 nobody, nobody 才行!这个很重要喔!因为大部分无法启用 squid 的朋友都是这个动作没有搞正确的原因啊!
 
squid 的 Owner 与 Group 是在 squid.conf 里面设定的,而至于 cache dir 则是需要我们手动来设定好他的权限呢!
 

最简易的 squid 设定方法
 
设定 squid 仅要修改一个档案而已,那就是 /usr/local/squid/etc/squid.conf 啰( RPM 版本就不相同啰!请自行找出来吧! )!请注意,在这个例子当中,我们并没有介绍高档配备的设定,仅只是列出重要的设定项目还有一些观念,您所想要的设定必需要视您的主机规划而定,例如 cache dir 每个人所放置的目录都不相同啊,所以直接拿我的设定来启动时,可能会完蛋啊!请注意需要修改成您所想要的样式才行!好了,在这个小节当中,我们仅列出来几个一定要设定的参数,至于更进阶的参数将留待后面分别介绍。
 
另外要额外提醒的是,在 squid.conf 这个档案当中,预设的情况下是『除了本机可以使用 squid 的少部分功能外,其它所有的项目都没有被启动』,所以您必需以 vi 的搜寻功能找到下列的设定项目后,将批注符号 (#) 拿掉,或者是自行输入底下的设定才行喔!不啰唆,马上进行吧!
  
[root@test root]# cd /usr/local/squid/etc
[root@test root]# vi squid.conf
# 1. 关于网络的参数设定部分
#   在这个部分当中,最重要的就是启用 squid 这个 daemon 的 port 了!
#  在预设的情况下,公认的标准 proxy port 为 3128 ,至于被查询封包
#  观察的则是 3130 这个 port,这里我们分别启用这两个 port !如果您的
#  Proxy 还有帮人家代理 https 这个由 SSL 协议启用的 port ,那么还需要
#  启动 https_port ,但是我们这里不谈论 SSL 啦!太危险了~
http_port 3128
icp_port 3130
 
# 2. 设定快取目录 ( Cache dir ) 的大小与记录档案所在的目录
#  这个设定是重要到爆的地方,一定得设定正确才行啊!上面我们不是
#  提过关于硬盘与目录吗?好了,现在这样假设:我有两块 partition ,
#  这两块 partition 分别挂载在 /usr/local/squid/var/cache1
#  以及 /usr/local/squid/var/cache2 这两个区域,此外,两块
#  partition 一块为 1GB (cache1) 另一块为 2 GB (cache2) ,则设定为:
#  <cache_dir> <aufs|ufs> <目录所在> <MBytes大小> <dir1> <dir2>
#  那个 aufs 只有在编译的时候加入 –enable-async-io 那个项目才有支持,
#  至于目录所在地与所占用的磁盘大小则请视您的主机情况而定,
#  而后面 dir1, dir2 则是两个次目录的大小,通常 16 256 或 64 64 皆可,
#  一般来说,数字最好是 16 的倍数,据说效能会比较好啦!
#  注意1:下面两行需要『视您的主机环境而定!』不要照抄!
#  注意2:在底下的例子中,我的两块 partition 已经 mount 上该目录了!
#      这也就是说,底下的两个目录是『已经存在的!』
cache_dir aufs /usr/local/squid/var/cache1 1000 16 256
cache_dir aufs /usr/local/squid/var/cache2 2000 16 256
#  底下则是关于记录文件的放置目录与文件名!
cache_access_log /usr/local/squid/var/logs/access.log
cache_log /usr/local/squid/var/logs/cache.log
cache_store_log /usr/local/squid/var/logs/store.log
pid_filename /usr/local/squid/var/logs/squid.pid
 
# 3. 关闭认证机制
#  不晓得为什么,这一版的 squid 会自动的加入认证机制,请找到底下
#  几行,将他 mark 起来!
#auth_param basic children 5
#auth_param basic realm Squid proxy-caching web server
#auth_param basic credentialsttl 2 hours
 
# 4. 提供 squid 服务
#  预设的情况下,仅有本机可以使用 squid ,我们先将所有的权限开放
#  然后在一个一个的关闭啰!先找到底下这一行:
http_access deny all
#  将他改成
http_access allow all
 
# 5. 设定 squid 的拥有者与系统管理员信箱:
#  就是刚刚我们上一小节提到的 squid 的拥有者,请注意,这个
#  user 与 group 必需要在 /etc/passwd 及 /etc/group 里面存在方可成功!
#  我这里以权限最小的 nobody, nogroup 来做为范例,您也可以自行设定!
#  另外,cache_mgr 则是 squid 管理员的信箱,当 squid 发生问题时,
#  屏幕上就会出现这个信箱给使用者联系管理员之用!
cache_effective_user nobody
cache_effective_group nogroup # 您也可以改成 nobody !
cache_mgr youraccount@your.e.mail
 
# 6. 变更目录权限:
#  在预设的情况下,我们主要的纪录信息都写入 /usr/local/squid/var 里面,
#  所以这个时候需要将这个目录的权限改变成为 nobody 与 nogroup 所有!
#  当然啰,如果您的 cache_dir 不在这个目录当中,那么还需要额外自行建立,
#  例如我的 cache_dir 万一是在 /proxy1 与 /proxy2 时,那么我就必需要:
#  chown -R nobody:nogroup /proxy1
#  chown -R nobody:nogroup /proxy2
#  关于权限的问题是很重要的!请不要忘记了!
[root@test root]# chown -R nobody:nogroup /usr/local/squid/var
 
# 7. 开始启动 squid:
#  启动 squid 来试看看吧!不过,首先我们必需要建立快取目录的格式
#  才行,此外,由于我们想要以 nobody 来启动 squid ,所以你需要这样:
[root@test root]# /usr/local/squid/sbin/squid -z # 建立 cache_dir
[root@test root]# su nobody -c "/usr/local/squid/bin/RunCache &"
 
# 8. 查看是否真的启动了 squid 了?
[root@test root]# netstat -tln | grep 3128
tcp 0 0 0.0.0.0:3128 0.0.0.0:* LISTEN
 
# 9. 重新读取设定档 squid.conf 的方法:
[root@test root]# /usr/local/squid/sbin/squid -k reconfigure

 
在上面的设定中,重要的地方在于:
 

  • 你的硬盘规划与 cache_dir 的设定是否吻合:请注意,除非您是『架设着玩的,纯粹锻炼功力』的角度来设定 Proxy ,那么可以直接以预设的设定来搞定您的 cache_dir ,不然的话,前面我们提过,这个 Cache dir 可是影响 Proxy 效能的相当重要的因素之一,因此,千万不可大意啊!

 

  • 关于权限的大问题:由于我们常常提倡『不要以 root 来启动 daemon 』,所以这个 squid 我们是以 nobody 与 nogroup 来启动的!而 Process 与权限的关系是相当相当的重要的,因此,您必需要将上面刚刚建立的 cache_dir 更动整个目录的拥有者才行!如果是锻炼功力而已,那么随意建立一个目录更动一下他的拥有者与群组,就行了,不然的话,请依照您的硬盘规划好好的设计一番!

 

  • 关于 cache_dir 重新建置的步骤:在上面的第 7 个步骤当中,我们必需以 squid -z 来重建一下 cache_dir 的格式,这个步骤在第一次启动 squid 时才做,其它时候就不需要进行了!而进行这个步骤之前,请务必将上面提到的两点注意事项先搞定,否则您的 squid 很难启动喔!
     
  • 实际浏览器的查验:虽然上面第 8 个步骤已经确认了 squid 启动了,但是还不能肯定工作正常,这个时候如果您有 client 端的计算机,假设是 Windows 的 IE 好了,那么就赶紧来测试看看能不能使用 squid 啰!启动 IE 后,按下:
      『工具』->
      『Internet 选项』->
      『联机』->
      『局域网络设定』中,点选
      『使用 Proxy 服务器』

    并在网址列输入你的主机名称 ( 或者是 IP 均可 ),然后按确定离开!然后在 IE 中按按看网页的设定有没有成功,如果可以读到网页的话,表示 squid 可以正常的被使用了!
     

  • cache_dir 这个参数的意义与存取格式的类型
    这个设定项目就是限制暂存区大小的地方啦,格式为:
     
      cache_dir ufs /usr/local/squid/var/cache 100 16 256

     
    上面的说明是:暂存区目录为 /usr/local/squid/var/cache ,而暂存空间大小为 100M , 在这个暂存目录下有 16 个目录,而每个目录中又有 256 个目录 ( 你可以实际进入 /usr/local/squid/cache 当中去看看 ) 。如果你要改变暂存盘目录及这个目录的大小时,可以在这里修改!不建议修改 16, 256 这两个数值。另外,通常,如果是我们一般小型的区网 ( 不超过10个人 ) ,那设定个 500 MB作为 cache 应该够了,如果你的硬盘够大,设定成 1000 MB 以上更好,当然,与第一个注意事项相符的,需要与您的实际硬盘大小以及 Partition 放置的目录互相配合才行。修改过这个指令后,要再重新启动 squid 之前,请先使用下面的指令来使你的目录可以进行存取的动作,否则你的 squid 是不会工作的!例如你将上面的参数修改成:
     

      cache_dir ufs /usr/local/squid/var/cache 1000 16 256

     
    然后再进行下面的指令:
     

      rm -rf /usr/local/squid/var/cache
      mkdir /usr/local/squid/var/cache
      chown nobody:nogroup /usr/local/squid/var/cache
      /usr/local/squid/sbin/squid -z

     
    这样你的squid暂存目录就可以使用啰!另外,如果你在编译 (configure 过程中) 的时候有将 –enable-async-io 这一个参数加进来的话,将可以增加 aufs 这一个数据存取的格式!这个存取的格式可以将你的硬盘发挥到最极限的速度喔!虽然在 squid.conf 档案中有提及,这个 type 可能会有 bug 存在,不过,据鸟哥的使用结果,发现,没啥大问题!好用的很!所以,你可以将上面的咚咚改成下面的样子:

      cache_dir aufs /usr/local/squid/var/cache 1000 16 256

 
这样就算已经完成了一个『很阳春』的小型 proxy 了!为什么说很阳春呢?这是因为这个 Proxy 并没有上层 Proxy 喂数据,所以 Client 端的任何要求这个 Proxy 都需要『自己去捉』啊!哇!那么这个 Proxy 还真累啊!没错啊,所以底下我们要再来谈一谈其它几个增加 proxy 效能的方法,好让大家的 Proxy Server 可以真的加快您浏览的速度啊!
 


内存与磁盘快取留存百分比设定
 
内存与磁盘快取在 squid.conf 当中的相关简易设定如下所示,至于更详细的说明则在下表之后进行解说:
  
# 与内存有关的设定:因为我的系统很小,所以只给 8 MB!如果您的物理内存
# 很大的情况下,例如 512 MB,可以考虑加大到 64 或 128 MB。
cache_mem 8 MB
# 与磁盘容量有关的设定(注:下列的 90 与 95 是百分比 )
# 如果您的 cache_dir 所在磁盘很大时,可以考虑将 4096 改成 32768 KB
cache_swap_low 90
cache_swap_high 95
maximum_object_size 4096 KB
# 与内存保存数据有关的设定
maximum_object_size_in_memory 8 KB
# 我们经由 dns 正反解以及 IP 的结果,记录在暂存区啊!
ipcache_size 1024
ipcache_low 90
ipcache_high 95
fqdncache_size 1024

 
内存的需求数量:
事实上,除了硬盘之外,内存可能是另一个相当重要的影响 Proxy 效能的因子!怎么说呢?因为 Proxy 会将数据存一份在 Cache 硬盘中,但是同时也会将数据暂存在内存当中啊,以加快未来使用者存取同一份数据的速度!所以啰,内存本来就会被 squid 的程序所消耗掉一些!一般来说,被 squid 消耗掉的内存约略每 1GBytes 的 cache_dir 空间就消耗 10MB 的内存容量,所以,如果以上面我们的设定为例 (cache1, cache2 共有 3GB), 那么就有 30MB 以上的内存被消耗掉了!除此之外, squid 程序执行当中亦会额外的消耗掉一些物理内存,这部份占用掉的内存约为 10-20 MB 。
 
除了这些内存是必须要的之外,您还可以额外的指定一些内存来进行比较『热门』的数据存取!也就是说,可以额外的再加一些内存来帮助 squid 工作,而不仅只是上面提到的内存使用量!那个就是 cache_mem 这个设定参数的用途啦!所以,请特别留意啊,『 cache_mem 并不是指我要使用多少内存给 squid 使用,而是指 "我还要额外提供多少内存给 squid 使用" 的意思 』!因此,假设我有 X GB 的磁盘快取空间,而且 squid 程序使用掉 15 MB 的内存,那么我 squid 使用掉的内存就有:
 

    X * 10 + 15 + "cache_mem 设定值"

 
您可以自行计算一下您的 squid 消耗掉多少内存喔!此外, squid 官方网站建议您的物理内存 (不含 swap 的内存容量) 最好是上面数值的两倍,也就是说,假如我的快取容量为 3 GB , cache_mem 设定为 16MB ,那么我的 squid 至少会消耗掉 3*10+15+16 = 61MB,则我的物理内存最好至少要有 122 MB 以上,才会有比较好的效能!当然,这个单指 Proxy 部分而已,如果您的该部主机还有负责其它的工作,呵呵!那么内存就得在累加上去啦!一般来说,如果您的 Proxy 很多人使用时,这个值越大越好,但是最好也要符合上面的需求喔!
 
关于磁盘容量的设定
请注意,如果您的磁盘快取空间额满了,那么您的 squid 也就『挂点』了!因此,请随时注意你的磁盘快取空间!但是,要我天天去注意 squid 的 cache_dir 里面的容量,也太劳神了吧?!这个时候就必须要『cache_swap_low, cache_swap_high 』这些设定的帮忙了!如果以上面表格的设定为例时,他的说明是『当我的快取目录所占容量为总快取量的 95% 时,那么我的 squid 将会自动的将快取目录内的容量减低至剩下 90% 的容量! 』注意,那个 90 与 95 为百分比例喔!以我们的设定为例,我的 cache_dir 总共有 3GB ,那么当快取空间被使用了 3*0.95=2.85GB 时,我的 squid 会自动的将 2.85GB 里面较旧的数据删除,使快取目录内剩下 3*0.9=2.7GB 的空间!这样能了解了吧?请特别注意,如果您的 proxy 容易很多人同时上线时,请将这两个数值更动一下,例如变更为 70 85 ,为什么呢?万一您的使用者突然间都上线了,然后下载大量的档案,那么『瞬间』可能会使您的 cache 目录超过额度,导致 cache 死掉!所以降低 cache_swap_high 对于大型 proxy 是有需要的!
 
是否需要记录捉到的数据
还有一个小问题要说明的,是否使用者要求过的数据我都要记录呢?呵呵!那当然不是啦!如果都记录的话,万一像最近好多 Linux distribution 都释出了他们新版的 Linux ISO 档案,那些档案一个都有 600 MB 以上的容量,万一使用者下载个几个这样的档案,我们的 Proxy 想不爆掉都很难~所以这个时候就要限制一下需要记录的『最大档案』啦!在预设的情况下,我们的 squid 对于超过 4MB 的档案是不记录的(就是不放入 cache 的意思),但是如果您的硬盘够大的话,我都喜欢将这个数值调大一点,为什么呢?万一我的使用者常常下载一些 10~20 MB 的套件档案,难道我每次都要到官方网站去下载一次吗?当然我不想这样啊!所以我通常将这个数值调大到 32MB ,或者是 32768 KB 啰!除了磁盘快取之外,内存的快取可以记录的最大档案容量也可以修正一下喔!但是我们的内存可就珍贵的多了!不要开太大,大约默认值就很不错了!
 
关于 IP 与完整主机名称的纪录
如果能将 IP 与主机名称记录下来的话,搜寻的脚步也会加快一些的!所以以上面的表格为例,我们分别开启了 ipcache_size 与 fqdncache_size( 后面接的数值是 bytes )的记忆容量,由于这些数据都是 ASCII 的数据,用不了什么空间,因此 1024 bytes 已经足够了!至于后面的 low 与 high 则与前面说明的相同!
 


acl 的用法与用途
 
在 squid.conf 这个档案里面最常看到的大概就是 acl 这个设定项目了!他可是整个 squid.conf 的重头戏啊!很多的来源与目的管制都是靠他来设定完成的呢!我们底下就稍微谈一谈这个重要的咚咚吧!首先,他的语法为:
  
<acl> <acl名称> <acl类型> <设定的内容>

 
上面那个 <acl名称> 可以想成是一个昵称就是了!别想太多~就只是一个代名词,至于 acl 类型可就有趣的多了,他主要有下面这几大类:
 
以来源端来控制:

  • src  ip-address/netmask:主要控制『来源的 IP 地址』,例如『acl nckuip src 140.116.0.0/16 』,这表示未来在 squid.conf 里面,任何使用到 nckuip 这个代名词时,就表示他是『来源为 140.116.0.0/16 的地址』!
  • src addr1-addr2/netmask:主要控制『一段范围来源的 IP 地址』,例如『acl nckuevoffice src 140.116.44.120-140.116.44.130/24 』就表示 nckuevoffice 这个代名词为来自 140.116.44.120 140.116.44.130 之间这 11 个 IP 的要求!』请注意,是『来源』喔!
  • srcdomain .foo.com:主要控制『来源为一某个网域的计算机』的意思,例如:『acl vbirdhome srcdomain .vbird.org』,与 src 很类似,都是控制来源的客户端,只不过 src 控制的是 IP 而 srcdomain 则是控制 domain name 就是了!

 
以目的端来控制:

  • dst ip-address/netmask:主要控制『目的端的 IP 地址』,与 src 类似,只不过是用来控制『目的端』的地址!
  • dstdomain .foo.com:这个就没问题了吧?就是用来控制『目的端的网域』啰!与 srcdomain 类似喔!

 
以正规表示法的方式来控制

  • url_regex [-i] ^http:// :除了上面两种基本的方法之外,我们也可以使用正规表示法的方式来控制『网域』的设定值呢!例如『 acl urlname url_regex ^http://linux\.vbird\.org.* 』这表示 urlname 代表的就是来自 http://linux.vbird.org 这个网站的『任何资料』,因为『 .* 』代表任意字符的意思啊!如果仅只是一些档名,例如 gif 这一类的档名时,要怎么作呢?就如底下的说明啦!
  • urlpath_regex [-i] \.gif$:上面提到的是关于整个网址的名称,这里则是只要『URL 部分相同』就可以啦!例如『acl gifname urlpath_regex \.gif$ 』则是代表 gifname 代表的是 url 后面是 .gif 的网址,呵呵!那就是 gif 的图档附档名嘛!!这样应该不难理解了吧!

 
由于在 squid 当中很多时候都会用到一些 IP 网域啦,以及 domain name 等等的数据,这个时候这个 acl 就可以看做与 bash 里面的『变量』很类似啰!您可以参考看看的啦!只是他的用途相当的广泛,这个在底下我们会进一步的使用 acl 搭配各种设定值来进行说明的!
 


上层 Proxy 的选择与负载分流的设定方法
 
上层 Proxy 的设定方式: cache_peer
我们在上面的原理部分说明过,一部有效能的 Proxy server 必须要能利用上层 Proxy 所提供的效能,才能达到我们所想要的『加速』功能!那么当然大前提之下就是需要先找到『最佳效能的上层 Proxy 主机』啰!没错!就是这样的啦!在这里,我们以成功大学的学术网络为架构进行说明,如果您的网络架构并非为学术单位的话,请依照您能找到的上层 Proxy 来进行设定喔!需要特别留意的是,由于成大有许多的上层代理服务器,这些服务器都可以做为我个人 proxy 的 parent proxy 主机,不过,由于各个主要的 parent proxy 所提供的网域服务都不尽相同,所以我们得先将主要的几个服务器对应的网域给他找出来,底下是一个例子:
 
gate.ncku.edu.tw 主要服务 .com 的网域
gate3.ncku.edu.tw 主要服务 .net .edu 的网域
gate2.ncku.edu.tw 主要服务非 .com .net 与 .edu 的网域
proxy.ncku.edu.tw 主要服务任何网址
 
至于在 squid.conf 当中设定的参数则是『cache_peer 』这个项目,设定的样式为:
  
<cache_peer> <主机名称> <类别> <http_port> <icp_port> <其它参数>
类别:主要有上层(parent) 与同一层 (sibling) 两种,我们这里主要介绍的是
   上层 Proxy 也就是 parent 这一大类,如果您想要架设一个小型的 Proxy
   Cluster 的话,可以考虑组成 sibling 的功能,由于我们仅想要架设单部
   Proxy Server ,所以这里我们就不探讨 sibling 了!
http_port icp_port:就是我们最前面设定的啦! Internet 上面预设是
   3128 3130 这两个!
其它参数:其它参数的部分就很重要了,主要有底下几个重要参数:
  proxy-only :只取出上层 Proxy 的 cache 给 client ,并不会将上层 Proxy
    的数据存在自己的 cache 硬盘中;
  weight=n :权重的意思,因为我们可以指定多部上层 Proxy 主机,哪一部
    最重要?就可以利用这个 weight 来设定, n 越大表示这部 Proxy
    越重要!
  no-query :一般来说,如果要向 sibling 要求数据时,会向 sibling 送出
    icp 的要求封包,使用 no-query 就可以取消。一般来说,如果向上层
    Proxy 要求资料时,可以不需要发送 icp 封包,以降低主机的负担
  default  :表示该部主机为预设的 Proxy 主机的意思;
  no-netdb-exchange:表示不向附近的 Proxy 主机送出 imcp 的封包要求
  no-digest :表示不向附近主机要求建立 digest 纪录表格。
范例:
cache_peer gate.ncku.edu.tw parent 3128 3130 no-digest no-netdb-exchange
cache_peer gate2.ncku.edu.tw parent 3128 3130 no-digest no-netdb-exchange
cache_peer gate3.ncku.edu.tw parent 3128 3130 no-digest no-netdb-exchange
cache_peer proxy.ncku.edu.tw parent 3128 3130 no-digest no-netdb-exchange

 
基本上,由于我们向上层 Proxy 要求数据的时候,也是需要时间的,因此,这里我们建议您不要设定太多的上层 proxy 主机,一般来说, 2~4 部也就足够了,太多部 上层Proxy 的情况反而可能会拖垮您的 Proxy 速度呢!OK!既然有了上层 Proxy ,而且每一部所负责的网域并不相同,所以我们当然就需要将网域分门别类啰!如何将这些网域分门别类呢?那就需要 acl 的帮忙啦!先提醒一下,由于我们的 Proxy 旨在帮助 client 端取得数据,所以使用 acl 的时候,是针对『目标』来进行设定的,因此,使用的是 dst 与 dstdomain 喔!在这里,我们将主要的网域分成底下这几大类:
 

0. 自己想要直接使用自己的 Proxy 捉取的资料
acl directip dst 140.116.44.0/24
acl directdn dstdomain .vbird.org tw.yaoo.com tw.news.yahoo.com 

1. 成大附近的网域
acl nckudn dstdomain .ncku.edu.tw
acl nckuip dst 140.116.0.0/16 163.28.112.0/24 163.28.113.0/24 163.28.114.0/24 163.28.115.0/24 163.28.116.0/24 163.28.117.0/24
 
2. 台湾的网域 (请注意:底下为同一行)
acl twdn dstdomain .tw .twnic.net .hinet.net .acer.net .wownet.net .seeder.net .silkera.net .neto.net timenet.net tw.aunet.net .adsldns.org
 
3. 台湾的 IP (注意:底下为同一行)
acl twip dst 163.28.0.0/16 140.96.0.0/11 140.128.0.0/12 140.92.0.0/16 139.175.0.0/16 139.223.0.0/16 163.12.0.0/14 163.16.0.0/14 168.95.0.0/16 192.72.0.0/16 192.83.160.0/19 192.83.192.0/22 192.192.0.0/16 202.39.0.0/16 202.132.128.0/17 202.145.224.0/19 203.64.0.0/12 210.64.0.0/13 210.60.0.0/14
 
4. 一些商业、网域、教育、以及其它的网域
acl comdn dstdomain .com
acl netdn dstdomain .net
acl edudn dstdomain .edu

 
这样子就作好了基础的工作了!接着下来,我们要开始来设定『各个主要的网域要透过哪一个上层 Proxy 来进行数据的取得?』这里就有点难度啦!得小心在意一下!我们的基本假设为这样:
gate.ncku.edu.tw 仅负责 .com 的网域;
gate3.ncku.edu.tw 仅负责 .net 与 .edu 的网域
gate2.ncku.edu.tw 不负责上面的三个网域
proxy.ncku.edu.tw 不负责上面三个网域
这么一来,使用 cache_peer_access 这个设定项目时,我们的设定会变成这样喔!
 

# 主要的格式范例:
# <cache_peer_access> <上层 Proxy > <allow|deny> <acl名称>
cache_peer_access gate.ncku.edu.tw allow comdn
cache_peer_access gate.ncku.edu.tw deny !comdn
cache_peer_access gate3.ncku.edu.tw allow netdn
cache_peer_access gate3.ncku.edu.tw allow edudn
cache_peer_access gate3.ncku.edu.tw deny !netdn
cache_peer_access gate3.ncku.edu.tw deny !edudn
cache_peer_access gate2.ncku.edu.tw deny comdn
cache_peer_access gate2.ncku.edu.tw deny netdn
cache_peer_access gate2.ncku.edu.tw deny edudn
cache_peer_access gate2.ncku.edu.tw deny directdn
cache_peer_access gate2.ncku.edu.tw deny directip
cache_peer_access gate2.ncku.edu.tw deny twdn
cache_peer_access gate2.ncku.edu.tw deny twip
cache_peer_access gate2.ncku.edu.tw deny nckudn
cache_peer_access gate2.ncku.edu.tw deny nckuip
cache_peer_access proxy.ncku.edu.tw deny comdn
cache_peer_access proxy.ncku.edu.tw deny netdn
cache_peer_access proxy.ncku.edu.tw deny edudn
cache_peer_access proxy.ncku.edu.tw deny directdn
cache_peer_access proxy.ncku.edu.tw deny directip
cache_peer_access proxy.ncku.edu.tw deny twdn
cache_peer_access proxy.ncku.edu.tw deny twip
cache_peer_access proxy.ncku.edu.tw deny nckudn
cache_peer_access proxy.ncku.edu.tw deny nckuip

 
经过上面这个动作,我们就可以将 .com 的要求经过 gate.ncku.edu.tw 这一部,并且将 .net 与 .edu 给 gate3.ncku.edu.tw 来服务!此外,将没有被自己定义出来的 IP 或者是网域就丢给 gate2 以及 proxy 这两部来服务,至于我们既然是在台湾,所以自己定义出来的四个 acl 名字 (directdn, directip, twdn, twip) 当然是直接交给我们自己的 Proxy 来捉取了,相信速度上面应该不会有任何的影响的!因此,那四个主要的 acl 名称将在后面继续介绍如何不要透过上层 Proxy 来捉取资料喔! ( 请参考 always_direct 与 never_direct 的设定值 )
 
不要进行 cache 的设定值:
就如同我们在原理的部分提到的,有些网站的资料事实上并没有做为 cache 的需要,例如 CGI 档案就是一个很鲜明的案例!所以,一般而言, squid 在一开始就会自动帮我们设定好底下这三行:
 

hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

 
上面这三行的意思是:『只要在网址列出现了 cgi-bin 的字样时,该网页数据就不进行 cache 的动作!』这样一来,可以避免我们的主机存放太多的垃圾啊! ^_^!当然啦,在某些时候,例如您所在的网域真的是很慢,同时又没有适合的上层 Proxy 的环境下,那么将 cgi 之类的网页 cache 下来,也未尝不是一个可以节省浏览时间的一个方法!如果确定要将 cgi-bin 底下的网页也存下来的话,那么就将上面三行批注掉啰!
 


与时间相关的设定值 ( connect_timeout, request_timeout )
 
由于 Proxy 的设定除了防火墙的额外功能外,最主要的目的还是在于将网页数据 cache 下来!既然如此的话,那么与 Server 的联机时间的确认就显的很重要啦!怎么说呢?万一今天您有设定三部上层 Proxy ,每一部的要求时间都控制在 5 分钟,如此一来,呵呵!万一今天刚好三部上层 Proxy 都挂点,难道我们就宿命似的要等待 15 分钟吗?当然不是啦!所以这个时候,我们可以将联机的等待时间缩短,好让 Proxy 可以发挥更为强大的功能啊!
  
# 1. 关于 cache 的更新时间趋势
# 我们在快取当中的数据总是需要更新的对吧!那么如何设定更新的时间呢?
# <refresh_pattern> <regex> <最小时间> <百分比> <最大时间>
# 注意,那个 regex 指的是『目标』,这个『目标』大部分为网址,而这个网址
# 使用正规表示法来表示就是了!上面的意义是说:最小的时间内 (分钟),如果
# 档案有更动,就直接更新,或者是目标档案上次更新的时间到现在已经经过最大
# 时间的『百分比』时,就予以更新!范例如下:
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
# 第一行的意思是,如果网址裂开头是 ftp 的话,那么在一天(1440分钟)后,如果
# proxy 再次取用这个档案时,则 cache 内的数据会被更新! 

# 2. 关于联机时间限制
# connect_timeout 指的是连接到其它主机的时间多久之后算失败,预设是两分钟
#        不过我觉得我的机器联机速度还算快速,所以减低了时间
# peer_connect_timeout 指的是连接到上层 Proxy 多久不成功就算失败,
#        由于上层 Proxy 与我的环境息息相关,不可能连不上,
#        所以我这里将时间调整的很短!
# request_timeout 指的是,联机上了,但是要求的时间会多长?
# persistent_request_timeout 指的是连续要求时间会有多长?
connect_timeout 30 seconds
peer_connect_timeout 10 seconds
request_timeout 1 minutes
persistent_request_timeout 20 seconds
# 请特别注意喔!上面的设定当中,是因为我的环境『还算不错』,所以我将
# 时间调整的很短,因为我晓得我的环境当中不会有花很长时间的状况,
# 这里请依照您的网络环境来调整喔!或者干脆不要设定也没有关系!

 


总是系统自己来捉数据(always_direct)
 
刚刚我们在主机分流的地方有提过,有些数据我们要让我们自己的 Proxy 去捉取数据即可,而不透过上层 Proxy ,那么怎么达到这样的目的呢?也不是很难啦!就告诉 Proxy 不要去捉就好啦!怎么告诉他呢?使用 always_direct 或 never_direct 即可!
  
# 1. 使用 acl 先定义出要直接或者不要直接去的网址或 IP ,
#   这个部分我们刚刚在上面已经设定好了,就是 directip 与 directdn,
#  还有 twdn 与 twip 这几个咚咚!
# 2. 如果是直接要 Proxy 出去捉数据,可以使用 always_direct
always_direct allow directip directdn 

# 3. 如果一定『拒绝经由上层 Proxy 出去』的话,可以使用 never_direct
never_direct deny twdn twip

# never_direct allow 表示一定会经由上层 Proxy 来捉资料,
# never_direct deny 当然就表示一定是自己向外头捉资料啰!

 
事实上,这个东西可以让我们的 Proxy 变的很灵活!假设这样的一个案例,我们自己有一个内部的 WWW 网站,这个网站的网址为 192.168.0.100 ,如果我要经由上层 Proxy 去捉数据的话,那不就完蛋了~因为这个是『私有 IP 』的网域啊!所以,我将他写入 directip 那个 acl 的设定当中,如此一来,呵呵!我们的 Proxy 会自动的经由自己的 route table 去到内部网域读取数据给你,您根本不需要变更您的其它设定就可以自由自在的读取内部与外部的主机数据!此外,如果您发现同一网域还有其它的 WWW 主机,把这些主机的 IP 或主机名称写入 directdn 或 directip 的 acl 设定当中吧!因为在同一网域时,您自己去捉一定会比上层 proxy 捉完之后再传给你来的快吧!
 
当然还不只如此啦,有的 WWW主机由于设定的关系,他们并不允许我们的上层 Proxy 来捉取数据,最常见的例子就是类似总图对校内的 client 端开放的图书查寻的软件了!因为如果开放了这些上层 proxy 的话,那么全台湾所有的人只要将他们的浏览器 proxy 设定为成大的上层 proxy 主机,就可以使用成大的资源了!那岂不麻烦?因为这些资源是需要花费经费的啊!这个时候,您也就必须要让这些网址经由我们的 Proxy 自己去捉取啰!这样可以了解乎!
 


限制使用 proxy 使用者与 proxy 目标的方式 (acl and http_access )
 
既然 proxy 有一定的风险存在,自然就不能让任何人都能使用你的 proxy 主机啰!没错!所以我们必须要管制联机的使用者!管制的方法真是简单的很!就是使用 acl 配合 http_access 即可!在预设的情况中, squid 已经帮我们设定好一些安全的可以联机的 port 了,此外,也只有本机可以使用 proxy 功能呢!
 
那么万一如果我样让内部 192.168.0.0/24 这个网域的使用者可以使用我的 proxy 呢?该如何设定?呵呵!您可以这样做:
  
# 1. 先设定这个内部网域的 acl 名称
acl inside src 192.168.0.0/24
 
# 2. 设定 http_access 让他可以使用
http_access allow inside
http_access deny all

 
那个 http_access deny all 是系统预设的项目!刚刚我们在 最简单的 squid.conf 设定 时已经将他改成 http_access allow all 了!所以请记得将他给改回来啊!不然的话,您的 Proxy 很有可能会被人家利用喔!
 
这里再提供一个值得思考的咚咚,如果您跟我一样,都是使用拨接的 ADSL ,这样一来,由于我们的 IP 都不是固定的,如果要让我们的 ADSL 拨接的 client 可以使用我们刚刚设定的 Proxy 时,该怎么办?啊!这样就不能使用『 acl 配合 src 』的设定方式了吗?呵呵!当然不是,您可以这样想象:
 

  1. 我先申请一个动态 DNS 的网域名称,例如我的 tsai.adsldns.org
  2. 虽然我可以直接在 squid.conf 当中设定 acl 并使用 srcdomain 来设定我的 tsai.adsldns.org ,但是很抱歉的是,如果我的 tsai.adsldns.org 来连接到 Proxy 主机时,事实上,我的拨接制 IP 反查得到的主机名称一定不是 tsai.adsldns.org ,如此一来则 srcdomain 一点用处也没有了;
  3. 再换个方式,如果我写一支 script 来侦测 tsai.adsldns.org 所对应的 IP 呢?并且将他写入一个自订的设定档当中,这样一来,这个档案会随时记录最新的 tsai.adsldns.org 的 IP ,如此一来,我就可以使用 acl 配合 src 的设定方式了!

 
很麻烦吗?一点也不会,整个 script 可以像底下这样:
 

[root@test root]# cd /usr/local/squid/etc
[root@test etc]# vi squid.allow.sh
#!/bin/bash
# 这支程序可以用来查寻您的 IP 喔! 

# 1. 请输入您的主机名称,请注意,如果有两个以上的主机名称,
# 请分别以空格分开各个主机名称
hostnames='tsai.adsldns.org test.adsldns.org '
basedir=/usr/local/squid/etc/
email=root@localhost
squid=/usr/local/squid/sbin/squid

# 2. 以下为程序段,看看就好了!
[ -f $basedir/squid.allow.hosts.raw ] || \
touch $basedir/squid.allow.hosts.raw

cat /dev/null > $basedir/squid.allow.hosts.now
runornot=no

for host in $hostnames
do
hostip=`host $host | awk '{print $4}'`
if [ "$hostip" == "out;" ]; then
echo 'Proxy 回应:没有 DNS 的讯息!' |\
mail -s 'Proxy 主机响应' $email
exit
fi
fileraw="$basedir"/squid.allow.`echo $host|cut -d '.' -f1`
[ -f $fileraw ] || touch $fileraw
hostraw=`cat $fileraw`
if [ "$hostraw" != "$hostip" ]; then
runornot="yes"
echo $hostip > $fileraw
fi
echo $hostip >> $basedir/squid.allow.hosts.now
done

if [ "$runornot" == "yes" ]; then
cat $basedir/squid.allow.hosts.raw > $basedir/squid.allow.hosts
cat $basedir/squid.allow.hosts.now >> $basedir/squid.allow.hosts
$squid -k reconfigure
mail -s 'Proxy 主机响应!Client IP 已经改变' $email < $basedir/squid.allow.hosts
fi

 
如此一来,我将可以把我的随时最新的 IP 纪录在 /usr/local/squid/etc/squid.allow.hosts 这个档案当中!那么要如何更新这个档案的内容在 squid 的设定档中呢!就这样设定即可:
 

# 1. 先设定这个档案的名称吧!
acl allowhost src "/usr/local/squid/etc/squid.allow.hosts"
 
# 2. 设定 http_access 让他可以使用
http_access allow allowhost
http_access deny all

 
然后将上面这个 squid.allow.sh 给他丢进去 crontab 当中,我预设都是在 30 分钟跑一次!
 

[root @test root]# vi /etc/crontab
10,30 * * * * root /usr/local/squid/etc/squid.allow.sh

 
这样就完整的啦! ^_^
 


额外的功能参数
 
除了上面提到的这些关于网页快取的功能之外, Proxy 还可以帮我们进行 FTP 的服务取得资料喔!我们可以透过浏览器,经由 proxy 提供的 FTP 功能来登入对方主机,当然,对方主机必须要能够提供匿名登入啊!好了,我们来看看要怎样设定呢?
  
# 与 FTP 有关的设定项目,主要是针对被动式联机方式来设定喔!
ftp_user Squid@
ftp_passive on 

# 主要与 DNS 的设定值有关,如果在高负载的 Proxy 环境下,可以考虑将
# dns_children 提高到 20 左右,这个值最大为 32
dns_timeout 1 minutes
hosts_file /etc/hosts

 
还有一些额外的范例可以参考看看喔:

鸟哥的范例:http://linux.vbird.org/linux_server/0420squid/0420squid_vbird_ex
成大 gate.ncku.edu.tw 的 squid.conf 设定: http://turtle.ee.ncku.edu.tw/~tung/proxy/squid.conf.ncku
电机系 turtle.ee.ncku.edu.tw 的 squid.conf 设定: http://turtle.ee.ncku.edu.tw/~tung/proxy/squid.conf.turtle
台南学校范例 proxy.school.tn.edu.tw 的 squid.conf 设定: http://turtle.ee.ncku.edu.tw/~tung/proxy/squid.conf.school.tn  


Client 端设定 
    既然 proxy 是给浏览器用的,那么自然在浏览器上面就需要设定一些参数啰!呵呵,没错!那么如何设定呢?由于不同的浏览器在设定 Proxy 的地方也都不同,所以底下我们介绍目前比较常见的两款浏览器,分别是 Netscape 以及 IE 的设定,至于其它的浏览器,请参考各浏览器的相关说明啊!
     

    Netscape
     
    Netscape 的设定并不难,只要修改一个小地方即可!
      
    1. 开启 Netscape 之后,启用『编辑』并选择『偏好设定』项目,如下所示:
       

       
    2. 在出现的画面当中,先按下『进阶』左边的展开模式,然后选择底下的『代理服务器』,则画面会出现如下的模样。之后,在右边的窗口当中选择『自行设定代理服务器的组态』项目,并且再按下『检视』,则到下一步去设定:
       

       
    3. 在出现的方框中,由于我们通常仅针对 WWW 进行快取,所以可以仅针对 HTTP 的项目进行设定!在下面的画面当中,请输入『Proxy 主机的 IP 或者是 domain name 』,以及『连接的 port number』,这样就可以了。不过,如果有某些网域您想要直接让你的 PC 去捉取数据时,可以将该网域名称填写在最下方的方框中!以下面的画面为例,我的 PC 要连接到 linux.vbird.org 以及 www.study-area.org 时,就可以不透过 Proxy 啦!这个功能也挺适合可以自行调配流量、流速的朋友!
       

       
    4. 再按下『确定』之后,立刻就生效了!

     


    Internet Explorer
     
    在 IE 的设定上面也一点都不难啊!
      
    1. 开启 IE ,然后在『工具』内选择『Internet 选项』:
       

       
    2. 在开启的窗口内选择『联机』并点选下方的『局域网络设定』:
       

       
    3. 在出现的方框中,先在下方打勾起『使用 Proxy 服务器』,然后依序在网址列填入『 Proxy 的网址或者是 IP 』以及连接埠填入『 Proxy 所开放的 port number』,如下方的设定即可。
       

       
    4. 另外,如果有某些网域不想透过这个上层 Proxy 的话,点选上图的 『进阶』那一项,在出现的框框的最底下,可以填入你不想透过 Proxy 捉取的网站网址,如下所示:
       

    如此一来则设定好了 Proxy Server 啰!


Server 端进阶设定 
    既然一些主机的设定已经搞定了,接着下来又是到了 Server 的安全与进阶设定时间啦!那么在安全的设定方面,最重要的自然又是我们一再强调的登录档的分析啰!如何分析登录档呢?难道又要自己动手写分析的 scripts ??呵呵!不用麻烦了,我们可以使用前辈智慧的结晶,直接有软件可以来进行分析喔!还有,既然强调 Proxy 可能会被滥用,所以当然要适当的管理了!这个时候的防火墙设定又要出现啦!呵呵!赶紧来看一下怎么处理吧!
     

    末端资料分析 pwebstat
     
    事实上, squid 已经有众多的登录文件分析软件了,而且大多是免费的 (http://www.squid-cache.org/Scripts/) ,您可以依照自己的喜好来加以安装与分析你的 squid 喔!我这里仅介绍目前很常被使用的一套软件,也就是 pwebstats 这一套!你可以在 pwebstats 的官方网站上面查得更新的数据 ( http://martin.gleeson.com/pwebstats/installation.html )。不过,由于 pwebstats 在安装的时候需要使用到其它的函式库,因此,你必须要先安装 fly 这套软件才行啊!而在安装 fly 之前,又需要先安装一些必备的图示用的函式库才行,那就是类似 gd, libpng, zlib 等等的套件喔!听起来似乎很多东西要做,但是事实上却非常简单的啦!好吧!那么我们就一步一步的来安装这个 pwebstats 吧!
     
    安装所需要的套件数据:
    除了系统自己可能已经安装好的 gd, libpng, zlib 之外,您可以由文末提供的官方网站的连结来取得最新的 fly 与 pwebstats 套件,而如果您不需要使用最新的资料,那么也可以经由 鸟哥的私房菜 提供的比较旧的套件版本来安装 ( http://linux.vbird.org/download/ )。我这里假设您已经将所需要的 fly-2.0.0.tar.gz 与 pwebstats-1.3.8.tar.gz 套件都下载到 /root 底下了,那么您可以这样做: 
        
      1. 确认一下到底有没有我们需要的一些相关套件?
      [root@test root]# rpm -qa | egrep '(^gd-|^zlib-|^libpng-)'
      libpng-devel-1.0.14-0.7x.4
      gd-1.8.4-4
      zlib-1.1.3-25.7
      zlib-devel-1.1.3-25.7
      libpng-1.0.14-0.7x.4
      gd-devel-1.8.4-4
      # 请注意,我是以 Red Hat 7.2 为例,如果您的系统并非 RH 7.2 ,那么可能
      # 套件后面接的版本会不太一样,不过,至少都需要有上面的几样套件就是了!
      # 就是 gd, zlib, libpng 这三个套件啦!有的 distribution 还会有 xxx-devel
      # 之类的名称,那个也需要安装喔!如果发现没有安装的话,请拿出您的原版光盘片,
      # 将他 mount 上之后,好好的将他搜寻一下,并且安装上去吧!很重要,一定要
      # 安装这些套件之后,底下的动作才会成功呢!
       
      2. 开始安装 fly 这支程序
      [root@test root]# cd /usr/local/src
      [root@test src]# tar -zxvf /root/fly-2.0.0.tar.gz
      # ….会产生一个 fly-2.0.0 的目录
      [root@test src]# cd fly-2.0.0
      [root@test fly-2.0.0]# make
      注:
      # ….如果没有出现底下的字样那么就是成功了!
      /usr/bin/ld: cannot find -lttf (或者是 ljpeng …)
      collect2: ld returned 1 exit status
      make: *** [fly] Error 1
      # 如果是出现 warning 的话,还不打紧,因为仅只是警告而已,所以问题不大,
      # 但是如果出现上面的字样时,就会连带出现第三行的 Error ,那就是编译失败了
      # 果真如此的话,请先寻找一下,以上面为例,找不到 lttf ,而 lttf 其实
      # 就是 libttf 檔名啦!(所以 ljpeg 就是 libjpeg )所以给他下达:
      loate libttf
      /usr/lib/libttf.so.2
      # 嗯!找到了!其实是 libttf.so.2 啦!如果你的系统跟我的不同,有可能档名
      # 会不一样,所以请依照你的屏幕显示的讯息来下达指令喔!但是这个编译程序
      # 有点笨,不认识这个档案,所以我们要欺骗他一下,就是下达:
      ln -s /usr/lib/libttf.so.2 /usr/lib/libttf.so
      # 这样就可以啦!如果还有找不到的档案,同样的方式给他连结一下即可!然后
      # 再次的给他执行一次 make 即可!最后会产生一个档名为 fly 的执行档,
      # 如果没有产生执行档,那就是有问题啦!请赶紧再回头去查一查是否有某些
      # 套件没有安装,或者没有依照上面的方式建立连结档案!
       
      [root@test fly-2.0.0]# cp fly /usr/local/bin
      我们先将 fly 这支程序给他复制到 /usr/local/bin 这个目录去,可以直接使用
      这样就 OK 了!
       
      3. 开始安装 pwebstats 套件
      [root@test root]# cd /usr/local/src
--
hobbes.lee@gmail.com
Guangzhou China