分类:
2008-05-28 17:29:31
SQUID如何工作
[传统代理]
1. SQUID被绑定到代理服务器的3128端口;
2. 客户端浏览器被配置使用代理服务器的3128端口;
3. 客户端不需要配置DNS;
4. 代理服务器上需要配置代理服务器;
客户端不需要配置缺省路由。
Squid工作原理:
Squid 启动之后,会在 RAM 建立一个 Hash Table,记录硬盘中 object 配置的情形。
Squid 又会在 RAM 中建立一个 Digest Table(摘要表) ,其功能是和其他有合作关的 Squid (Sibling)互相交换 Digest Table,万一用户端想要的资料自己没有时,可以很快的知道哪一部 Squid Server 有资料(Squid 也可以透过 ICP 向其他 Squid 查询,但速度较慢)。但是 Digest Table 本身不小,既记忆体又频宽,如果 Server 的内存不够,对外带宽不够,反而比 ICP 查询更慢。
Squid的种类【可能不太合适叫做种类,不过没有更好的词。语文太差^_^】
child、sibling、parent。
关系如下:
Squid Server 之间的第一种关系是:Child 和 Parent。当 Child Squid Server 没有资料时,会直接向 Parent Squid Server 要资料,然後一直等,直到 Parent 给它资料为止。
Squid Server 之间的第二种关系是:Sibling 和 Sibling。当 Squid Server 没有资料时,会先向 Sibling 的 Squid Server 要资料,如果 Sibling 没资料,就跳过它直接向 Parent 要或上 internet 去拿。
一般 Squid Server 运作的模式是:
1. 当 Squid Server 没有资料时,会先向 Sibling 的 Squid Server 要资料,如果 Sibling 没资料,就跳过它直接向 Parent 要。
2. 向 Parent 要资料,然後一直等,直到 Parent 给它资料为止(Parent 自己有的资料或上 internet 去拿)。
3. 没有 Parent 时,就自己上 internet 去拿。
4. 如果这三者都拿不到资料,才向用户端回报拿不到资料。
编译安装Squid:
./configure --prefix=/usr/local/squid[-ip] --enable-async-io=160 --enable-icmp --enable-kill-parent-hack --enable-cache-digests --enable-default-err-language=Simplify_Chinese --enable-poll && make && make install
--enable-async-io=160:这项主要是设置async模式来运行squid,我的理解是设置用线程来运行squid,如果服务器很强劲,有1G以上内存,cpu使用SMP的方式的话可以考虑设成160或者更高。如果服务器比较糟糕就根据实际情况设了(不要太贪心哦^_^)。
--enable-icmp:加入icmp。默认不加。
--enbale-kill-parent-hack:当kill掉nobody的squid进程的时候会同时杀死它的父进程。
--enable-cache-digests:【。。。】
--enable-default-err-language=Simplify_Chinese:当有错误的时候在页面中显示简体中文。【不过squid还是会无情的把所有语言都装上,看的不顺的话手工删咯】
--enable-poll:可以提升效能。
Squid的结构介绍:
安装好的目录在/usr/local/squid-10 (这里假设我的主ip最后一段是10)
结构是:
bin/:放置squid默认写好的启动脚本。有RunAccel;RunCache;squidclient;前2个启动Squid可以使用,因为当squid进程死了后,这个脚本可以自动检测到。 RunAccel是用于web 加速用的脚本,而RunCache是用于做squid代理用的,squidclient是用本机做squid测试的。
etc/:squid.conf在这个目录中
libexec/:函数库;
man/:帮助文件。不用说了吧。。。
sbin/ :squid命令所在目录。一般如果我用来测试就启动squid命令。或者用这个命令创建swap,或者加-k参数重启之类的操作。
share/ :一些错误显示的html都在里面;
var/ :log,pid,swap都在这个目录中!
隔了很久才有空可以写这个经验体会,前一段时间一直在搞qmail,头大中,终于可以空下来了:)
先看squid的一个重要的,对我来说也是唯一需要配置的一个配置文件。选项非常多,当然,默认的squid.conf文件中对于每一个选项都有比较详细的说明,但是我还是想把我理解的以及必须要进行配置的选项罗列出来,以免过段时间自己都忘了^_^
以下的配置我是要向sina,sohu,163学习的web server的架构,试着自己去搭建一个这样的环境来看看效果到底如何。因此这里的squid不是用来做代理的,而是反向作为网站高速缓存。其实原理差不多,只是方向反一反而已,相信都能理解这点的。
使用的测试服务器为Dell 2650 双CPU至强2.4G 内存DDR 2G。OS为Freebsd 5.2.1(这里需要说明的是,从实际使用情况来看,squid跑在freebsd上的效果是最快最好的。这是由os的文件系统所决定的,千万不能用,solaris,感觉solaris的文件系统实在太慢,虽然非常稳定,而且跑多线程的效果是最好的。linux嘛~~~没有进行测试,不过感觉在freebsd之下,solaris之上。)
Squid.conf的几个重要参数的配置说明:
http_port 61.155.143.54:80 #Squid Server侦听的端口。假设我的主页的dns server 指到61.155.143.54上的,因此我必须让squid来侦听这个IP的这个端口。
cache_mem 32 MB #要额外提供多少内存给squid使用,这里的额外是指squid会将最常用的一些缓存放到这块内存中。这个指令也是我看了官方文档后才理解的。因为一开始从实际使用情况来看,我这边设32M的话,用top命令来查看一般会达到100M左右。这点让我让我很想不通,呵呵。然后就去看官方文档,发觉squid是这样来计算使用多少内存的:squid本身的进程大概10M-20M,然后下面我设的cache目录的大小是500M的话,那他放在内存里的hash索引大概需要20M左右,然后再加上这里设置的cache_mem的值。官方文档建议你的实际内存大小应该是这个squid所需要总内存的2倍以上。自己量力而为吧。cache_mem当然是越大越好了。
cache_dir ufs /usr/local/squid-54/var/cache 500 16 256 #设置squid存放cache目录的位置以及大小。第一个数字500是指目录的总大小为500M(默认为100M),第二个数字16是指第一级目录为16个,第三个数字256是指第二级目录为256个我个人觉得如果网站访问量大,并且内容很多的话,可以考虑将默认的100M改大一点,否则会报错。我就经历过,错误我忘了记录了(该死!)大致就是说超过Max的极限了,当时查了半天才找到罪魁祸首是这条指令,惭愧~~~。
cache_access_log none
cache_log none
cache_store_log none #我是将这些log记录都关了, 有需要的可以将它们打开。
acl managerIP src 10.10.10.10
acl ipcanbrows dst 10.10.10.0/24 #acl应该是squid配置里面最难理解也最需要花时间的地方了。应该说只需要修改很小的一部分就可以了,像这里我只是在原来的基础上加了2条记录,前面一条的意思是我定义了10.10.10.10为源路径,另外一条是指目的端是10.10.10.0/24这个网段。而managerIP,ipcanbrows随便取得名字。具体的规则需要下面的语句来定义。10.10.10.10就是本服务器的内网ip,而apache server的ip就在10.10.10.0/24这个网段里,不需要用外网ip,一定程度上节约了ip地址。
http_access allow manager managerIP ipcanbrows localhost #加上2个允许就可以了。高深的配置我觉得我也不需要,用户可以访问就达到目的了:)
httpd_accel_host virtual #由于我后面的apache server是基于ip来做虚拟主机的,因此这里需要设置成virtual。
httpd_accel_port 80 #http加速的端口,因为习惯等原因,还是将后面的apache server监听80端口。
httpd_accel_uses_host_header on #如果选了virtual的话,这里必须设置成on。
这里最多只列出了5%左右的选项,但是我配置的时候就只是用到了这些,因此,如果做网站加速的话,基本设置就是这些。当然需要更强劲的功能的话就需要好好读读squid的配置文件的文档了。
最后的步骤:
1. 改变var目录的权限:chown -R nobody var
2. 创建缓存目录:sbin/squid -z
3. 启动squid:bin/RunAccel & (这边我使用squid附带的启动脚本来启动squid,有个好处就是,如果squid的进程死了的话,这个脚本会自动启动squid,对于运行在线上的服务器来说,这点太重要了。
一些使用体会:
1. squid使用时间长了,速度会变慢,我的建议是每2小时kill掉squid 进程,RunAccel脚本会自动再启动的它。
2. 写一脚本,放进crontab中,每天凌晨4点左右把cache目录清空。
#!/bin/sh
# squid clean swap and restart script by marco lu
SQUID_DIR=/usr/local/squid-54/
PID_FILE=${SQUID_DIR}var/logs/squid.pid
CACHE_DIR=${SQUID_DIR}var/cache
PPID=`ps aux | grep -i squid-54 | grep -v grep|awk '{print $2}'`
kill -9 ${PPID} > /dev/null
kill -9 `cat ${PID_FILE}` > /dev/null
rm -rf $CACHE_DIR/*
${SQUID_DIR}sbin/squid -z > /dev/null
if [ $? -eq 0 ]
then
${SQUID_DIR}bin/RunAccel & > /dev/null
fi