squid详细介绍
Squid工作原理:
4 e- H2 q& Z; h5 U5 }, p. c
4 {1 y- ^, f. Y" t Squid 启动之后,会在 RAM 建立一个 Hash Table,记录硬盘中 object 配置的情形。
; k2 o9 V# \7 Y$ p! I
. x/ k# ^0 N( H% m) m0 C Squid 又会在 RAM 中建立一个 Digest Table(摘要表) ,其功能是和其他有合作关的 Squid (Sibling)互相交换 Digest Table,万一用户端想要的资料自己没有时,可以很快的知道哪一部 Squid Server 有资料(Squid 也可以透过 ICP 向其他 Squid 查询,但速度较慢)。但是 Digest Table 本身不小,既记忆体又频宽,如果 Server 的内存不够,对外带宽不够,反而比 ICP 查询更慢。 ( @$ P# W, U2 s% f M; m
0 z% o5 d9 Q I
1 P0 J$ H2 e7 d) O4 s# {0 B$ ?Squid的种类 2 F6 a" ^/ n. m$ T4 b$ @
( b8 w' q5 [) s$ V9 { child、sibling、parent。4 V( V1 b' L# G% n0 M
, y, i1 }3 ^0 l; ^; ~+ O 关系如下:
' y8 Q. q$ e3 P* Z
4 e9 r- |2 W5 `' j( q" J Squid Server 之间的第一种关系是:Child 和 Parent。当 Child Squid Server 没有资料时,会直接向 Parent Squid Server 要资料,然後一直等,直到 Parent 给它资料为止。
8 V( h! g, [9 `
% G+ W% W: ]' \- g, @- Y' X) J5 x4 } Squid Server 之间的第二种关系是:Sibling 和 Sibling。当 Squid Server 没有资料时,会先向 Sibling 的 Squid Server 要资料,如果 Sibling 没资料,就跳过它直接向 Parent 要或上 internet 去拿。
- W) Z9 u0 m8 z+ @" m0 }/ a ) K5 t* v) r8 z9 |8 p* Z% `
一般 Squid Server 运作的模式是:
& [& L) j' ~3 h! s2 j9 r$ o
8 R# p. b$ L, l% d0 a 1. 当 Squid Server 没有资料时,会先向 Sibling 的 Squid Server 要资料,如果 Sibling 没资料,就跳过它直接向 Parent 要。 6 O/ c# L P# n- S
/ Q4 i9 c3 \- K- X- U- ]0 r5 r
2. 向 Parent 要资料,然後一直等,直到 Parent 给它资料为止(Parent 自己有的资料或上 internet 去拿)。
1 N6 {% H$ a1 A 3. 没有 Parent 时,就自己上 internet 去拿。 ! I9 h# w- g- j$ h: I- q0 T0 u
8 l+ c! I( G2 x9 X9 P8 v& \ 4. 如果这三者都拿不到资料,才向用户端回报拿不到资料。
" a6 B: ?8 P+ t& p
! g/ P. q& V; H$ V( @) G+ R% d& E编译安装Squid:
9 @- X, ?, v) l9 c6 I
5 x( b# a8 r- c8 R" \( _./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 &;amp;&;amp; make &;amp;&;amp; make install" u9 T0 h: u* r( _1 Y; e
--enable-async-io=160:这项主要是设置async模式来运行squid,我的理解是设置用线程来运行squid,如果服务器很强劲,有1G以上内存,cpu使用SMP的方式的话可以考虑设成160或者更高。如果服务器比较糟糕就根据实际情况设了--enable-icmp:加入icmp。默认不加。" S& A- a0 t& [9 ]+ ~4 s7 I! Y1 y3 o9 l
--enbale-kill-parent-hack:当kill掉nobody的squid进程的时候会同时杀死它的父进程。
5 E- q) V9 x4 b: }2 V* R# o--enable-cache-digests:【。。。】- }0 w1 v* ?, F2 d4 X# h
--enable-default-err-language=Simplify_Chinese:当有错误的时候在页面中显示简体中文。【不过squid还是会无情的把所有语言都装上,看的不顺的话手工删咯】
9 Z5 I) M# l- B0 t--enable-poll:可以提升效能。
5 f8 l! D1 ^1 iSquid的结构介绍:
5 G9 q' L" K) T" E+ n8 }. \0 f. R5 N y+ v# ^2 u
安装好的目录在/usr/local/squid-10 (这里假设我的主ip最后一段是10)
. m+ O2 I7 E& P o; E/ O0 N6 }& A结构是: ; q! G# h2 Y- z% C* L
2 d( _- K) [! A9 ? bin/:放置squid默认写好的启动脚本。有RunAccel;RunCache;squidclient;前2个启动Squid可以使用,因为当squid进程死了后,这个脚本可以自动检测到。 RunAccel是用于web 加速用的脚本,而RunCache是用于做squid代理用的,squidclient是用本机做squid测试的。6 Y! ]- F. Q3 _5 R! H1 a1 ^6 G$ Z
etc/:squid.conf在这个目录中
- u4 }1 p2 Q( C libexec/:函数库; 1 p1 L- @( X4 a; p7 b' V+ P
man/:帮助文件。不用说了吧。。。
: ^( L. _0 J* {' d$ @4 c sbin/ :squid命令所在目录。一般如果我用来测试就启动squid命令。或者用这个命令创建swap,或者加-k参数重启之类的操作。 % o1 U1 O& z. ]$ s2 L8 G
share/ :一些错误显示的html都在里面; 3 m9 G+ m. g4 X4 j* U: J3 ?: D( }
var/ :log,pid,swap都在这个目录中。
9 I' A0 n' _9 p 先看squid的一个重要的,对我来说也是唯一需要配置的一个配置文件。选项非常多,当然,默认的squid.conf文件中对于每一个选项都有比较详细的说明,但是我还是想把我理解的以及必须要进行配置的选项罗列出来,以免过段时间自己都忘了^_^ - J1 B4 P4 r7 {7 ~* K9 P8 {6 p3 g: M8 \
以下的配置我是要向sina,sohu,163学习的web server的架构,试着自己去搭建一个这样的环境来看看效果到底如何。因此这里的squid不是用来做代理的,而是反向作为网站高速缓存。其实原理差不多,只是方向反一反而已,相信都能理解这点的。
6 E' h6 t7 M: _2 h+ D* v 使用的测试服务器为Dell 2650 双CPU至强2.4G 内存DDR 2G。OS为Freebsd 5.2.1(这里需要说明的是,从实际使用情况来看,squid跑在freebsd上的效果是最快最好的。这是由os的文件系统所决定的,千万不能用,solaris,感觉solaris的文件系统实在太慢,虽然非常稳定,而且跑多线程的效果是最好的。linux嘛"""没有进行测试,不过感觉在freebsd之下,solaris之上。) 4 p- c# H4 w3 t7 Z( G5 J# y
Squid.conf的几个重要参数的配置说明:
! Y" u. E, x0 z. h! Ehttp_port 61.155.143.54:80 #Squid Server侦听的端口。假设我的主页的dns server 指到61.155.143.54上的,因此我必须让squid来侦听这个IP的这个端口。
3 A/ b- T( V7 n# m; C: j3 A( [cache_mem 32 MB #要额外提供多少内存给squid使用,这里的额外是指squid会将最常用的一些缓存放到这块内存中。这个指令也是我看了官方文档后才理解的。因为一开始从实际使用情况来看,我这边设32M的话,用top命令来查看一般会达到100M左右。这点让我让我很想不通,呵呵。然后就去看官方文档,发觉squid是这样来计算使用多少内存的:squid本身的进程大概10M-20M,然后下面我设的cache目录的大小是500M的话,那他放在内存里的hash索引大概需要20M左右,然后再加上这里设置的cache_mem的值。官方文档建议你的实际内存大小应该是这个squid所需要总内存的2倍以上。自己量力而为吧。cache_mem当然是越大越好了。
3 @& p/ N6 U3 ]' O5 `cache_dir ufs /usr/local/squid-54/var/cache 500 16 256 #设置squid存放cache目录的位置以及大小。第一个数字500是指目录的总大小为500M(默认为100M),第二个数字16是指第一级目录为16个,第三个数字256是指第二级目录为256个我个人觉得如果网站访问量大,并且内容很多的话,可以考虑将默认的100M改大一点,否则会报错。我就经历过,错误我忘了记录了(该死!)大致就是说超过Max的极限了,当时查了半天才找到罪魁祸首是这条指令,惭愧"""。
% y5 p* X% R: R" n6 t2 l% f3 Rcache_access_log none! v; Y, J/ i) e; _
cache_log none
+ {) v; b! _; z5 ^, \cache_store_log none #我是将这些log记录都关了, 有需要的可以将它们打开。
0 e6 z% q2 X: d; D9 `) e# a& K/ O. jacl managerIP src 10.10.10.108 m. Z, u) i4 X
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地址。
% t; T# _; n' uhttp_access allow manager managerIP ipcanbrows localhost #加上2个允许就可以了。高深的配置我觉得我也不需要,用户可以访问就达到目的了:) 2 ?) K4 |& {& v% f1 m
httpd_accel_host virtual #由于我后面的apache server是基于ip来做虚拟主机的,因此这里需要设置成virtual。 ) l3 x7 ~# Z/ Q8 e! R+ R4 s" b
httpd_accel_port 80 #http加速的端口,因为习惯等原因,还是将后面的apache server监听80端口。 : D& I7 v0 Z+ d9 d
httpd_accel_uses_host_header on #如果选了virtual的话,这里必须设置成on。 . O2 I5 t6 L' W) q1 E4 M! A3 K+ b
这里最多只列出了5%左右的选项,但是我配置的时候就只是用到了这些,因此,如果做网站加速的话,基本设置就是这些。当然需要更强劲的功能的话就需要好好读读squid的配置文件的文档了。 5 I9 I% }. n4 v7 B9 ?
最后的步骤: 3 Y# {. k: ]5 Q8 t! ?1 s% \3 x
1. 改变var目录的权限:chown -R nobody var 5 b: B1 O8 {% O' E
2. 创建缓存目录:sbin/squid -z
" v# S7 }4 J# e; x. i3. 启动squid:bin/RunAccel &;amp; (这边我使用squid附带的启动脚本来启动squid,有个好处就是,如果squid的进程死了的话,这个脚本会自动启动squid,对于运行在线上的服务器来说,这点太重要了。
( o3 {1 D: `# Y, U" J一些使用体会: 0 a& |+ R' ]) j' x
1. squid使用时间长了,速度会变慢,我的建议是每2小时kill掉squid 进程,RunAccel脚本会自动再启动的它。
: J1 W9 e& w; y9 f& j' ]' m: M2. 写一脚本,放进crontab中,每天凌晨4点左右把cache目录清空。
! g# r8 W- }! O/ J% N#!/bin/sh
4 g, }7 F8 X6 u$ [8 H* l# q# squid clean swap and restart script by marco lu
9 @9 F, Z7 d4 U0 LSQUID_DIR=/usr/local/squid-54/
F7 F# m" u1 j; y& [ {% b2 _PID_FILE=${SQUID_DIR}var/logs/squid.pid% K2 J! d3 r. q7 ?6 ?! p
CACHE_DIR=${SQUID_DIR}var/cache
' s9 x" B* v! o6 {PPID=`ps aux | grep -i squid-54 | grep -v grep|awk '{print $2}'`9 ]4 Q ]2 n( M6 j! Q9 J+ x: q
kill -9 ${PPID} > /dev/null
& [* N) X/ W6 A. y1 w) Lkill -9 `cat ${PID_FILE}` > /dev/null# h8 R$ s: Y) u" b9 |# l1 f9 L
rm -rf $CACHE_DIR/*
$ L# \0 R, i0 @0 H+ ^2 [9 E${SQUID_DIR}sbin/squid -z > /dev/null
' k/ }, Y8 S W: s, ]7 `if [ $? -eq 0 ] / A3 a! b# s1 Z0 j/ [8 M5 T
then+ n* L5 ~, o& i2 H R" i
${SQUID_DIR}bin/RunAccel &;amp; > /dev/null2 ~8 W: O) J1 i# |8 S' e; ~$ P
fi $ H& J3 F6 K8 r# j/ H1 `/ }; G
- X9 j/ h, S0 U4 B: }6 e水平有限,希望广大高手指点!!!
点击图标进入精品网摘收藏 欢迎大家加入网络收藏夹