標(biāo)題:用Squid實現(xiàn)反向緩存代理
作者:陸培慶
寫于:2004-8-11 最后更新時間: 2003-09-21 4:04 PM
版權(quán)聲明:可以任意轉(zhuǎn)載,轉(zhuǎn)載時請務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明
http://kyunix.3322.org/doc/squid.htm
前言:
這份文檔主要說明用Squid實現(xiàn)反向緩存代理!而不是Squid最常用的代理服務(wù)器。當(dāng)然原理差不多,無非反過來想而已^_^!基本的思想來源于對于新浪,網(wǎng)易這些大網(wǎng)站的一次探索,發(fā)覺他們前面都是用一堆Squid檔著,然后后面才用Web Server,難怪可以抵擋那么高的流量,呵呵。詳情請參閱我的另一篇文章: 中國頂級門戶網(wǎng)站架構(gòu)分析。
1. Squid工作原理:
Squid啟動之后,會在 RAM 建立一個 Hash Table,記錄硬盤中 object配置的情形,也會在內(nèi)存中存放最常用的資料(后面會介紹);同時Squid 又會在 RAM 中建立一個 Digest Table(摘要表),其功能是和其他有合作關(guān)系的 Squid (Sibling)互相交換 DigestTable,萬一用戶端想要的資料自己沒有時,可以很快的知道哪一部 Squid Server 有資料(Squid 也可以透過 ICP 向其他Squid 查詢,但速度較慢)。但是 Digest Table 本身不小,如果 Server 的內(nèi)存不夠,對外帶寬不夠,反而比 ICP查詢更慢。
1.1 Squid的種類【可能不太合適叫做種類,不過沒有更好的詞。語文太差^_^】:
child、sibling、parent。
關(guān)系如下:
Squid Server 之間的第一種關(guān)系是:Child 和 Parent。當(dāng) Child Squid Server 沒有資料時,會直接向 Parent Squid Server 要資料,然後一直等,直到 Parent 給它資料為止。
Squid Server 之間的第二種關(guān)系是:Sibling 和 Sibling。當(dāng) Squid Server 沒有資料時,會先向Sibling 的 Squid Server 要資料,如果 Sibling 沒資料,就跳過它直接向 Parent 要或上 internet去拿。
一般 Squid Server 運作的模式是:
1. 當(dāng) Squid Server 沒有資料時,會先向 Sibling 的 Squid Server 要資料,如果 Sibling 沒資料,就跳過它直接向 Parent 要。
2. 向 Parent 要資料,然後一直等,直到 Parent 給它資料為止(Parent 自己有的資料或上 internet 去拿)。
3. 沒有 Parent 時,就自己上 internet 去拿。
4. 如果這三者都拿不到資料,才向用戶端回報拿不到資料。
2. 編譯安裝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:這項主要是設(shè)置async模式來運行squid,我的理解是設(shè)置用線程來運行squid,如果服務(wù)器很強勁,有1G以上內(nèi)存,cpu使用SMP的方式的話可以考慮設(shè)成160或者更高。如果服務(wù)器比較糟糕就根據(jù)實際情況設(shè)了(不要太貪心哦^_^)。
--enable-icmp:加入icmp。默認(rèn)不加。
--enbale-kill-parent-hack:當(dāng)kill掉nobody的squid進(jìn)程的時候會同時殺死它的父進(jìn)程。
--enable-cache-digests:【。。。】
--enable-default-err-language=Simplify_Chinese:當(dāng)有錯誤的時候在頁面中顯示簡體中文。【不過squid還是會無情的把所有語言都裝上,看的不順的話手工刪咯】
--enable-poll:可以提升效能。
3. Squid的結(jié)構(gòu)介紹:
安裝好的目錄在/usr/local/squid-10 (這里假設(shè)我的主ip最后一段是10)
結(jié)構(gòu)是:
bin:放置squid默認(rèn)寫好的啟動腳本。有RunAccel;RunCache;squidclient;前2個啟動Squid可以使用,因為當(dāng)squid進(jìn)程死了后,這個腳本可以自動檢測到。 RunAccel是用于web加速用的腳本,而RunCache是用于做squid代理用的,squidclient是用本機做squid測試的。
etc:squid.conf在這個目錄中
libexec:函數(shù)庫;
man:幫助文件。不用說了吧。。。
sbin :squid命令所在目錄。一般如果我用來測試就啟動squid命令?;蛘哂眠@個命令創(chuàng)建swap,或者加-k參數(shù)重啟之類的操作。
share :一些錯誤顯示的html都在里面;
var :log,pid,swap都在這個目錄中!
4. Squid的配置介紹:
這里我不會詳細(xì)一一介紹squid.conf中的每一項設(shè)置,只是一些重點。
squid.conf是對我來說也是唯一需要配置的一個配置文件。選項非常多,當(dāng)然,默認(rèn)的squid.conf文件中對于每一個選項都有比較詳細(xì)的說明,但是我還是想把我理解的以及必須要進(jìn)行配置的選項羅列出來,以免過段時間自己都忘了^_^
以下的配置我是要向sina,sohu,163學(xué)習(xí)的web server的架構(gòu),試著自己去搭建一個這樣的環(huán)境來看看效果到底如何。因此這里的squid不是用來做代理的,而是反向作為網(wǎng)站高速緩存。其實原理差不多,只是方向反一反而已,相信都能理解這點的。
使用的測試服務(wù)器為Dell 2650 雙CPU至強2.4G 內(nèi)存DDR 2G。OS為Freebsd5.2.1(這里需要說明的是,從實際使用情況來看,squid跑在freebsd上的效果是最快最好的。這是由os的文件系統(tǒng)所決定的,千萬不能用,solaris,感覺solaris的文件系統(tǒng)實在太慢,雖然非常穩(wěn)定,而且跑多線程的效果是最好的。linux嘛~~~沒有進(jìn)行測試,不過感覺在freebsd之下,solaris之上。)
Squid.conf的幾個重要參數(shù)的配置說明:
http_port 61.155.143.54:80 #Squid Server偵聽的端口。假設(shè)我的主頁的dns server 指到61.155.143.54上的,因此我必須讓squid來偵聽這個IP的這個端口。
cache_mem 32 MB#要額外提供多少內(nèi)存給squid使用,這里的額外是指squid會將最常用的一些緩存放到這塊內(nèi)存中。這個指令也是我看了官方文檔后才理解的。因為一開始從實際使用情況來看,我這邊設(shè)32M的話,用top命令來查看一般會達(dá)到100M左右。這點讓我讓我很想不通,呵呵。然后就去看官方文檔,發(fā)覺squid是這樣來計算使用多少內(nèi)存的:squid本身的進(jìn)程大概10M-20M,然后下面我設(shè)的cache目錄的大小是500M的話,那他放在內(nèi)存里的hash索引大概需要20M左右,然后再加上這里設(shè)置的cache_mem的值。官方文檔建議你的實際內(nèi)存大小應(yīng)該是這個squid所需要總內(nèi)存的2倍以上。自己量力而為吧。cache_mem當(dāng)然是越大越好了。
cache_dir ufs /usr/local/squid-10/var/cache 500 16 256#設(shè)置squid存放cache目錄的位置以及大小。第一個數(shù)字500是指目錄的總大小為500M(默認(rèn)為100M),第二個數(shù)字16是指第一級目錄為16個,第三個數(shù)字256是指第二級目錄為256個我個人覺得如果網(wǎng)站訪問量大,并且內(nèi)容很多的話,可以考慮將默認(rèn)的100M改大一點,否則會報錯。我就經(jīng)歷過,錯誤我忘了記錄了(該死?。┐笾戮褪钦f超過Max的極限了,當(dāng)時查了半天才找到罪魁禍?zhǔn)资沁@條指令,慚愧~~~。
cache_access_log none
cache_log none
cache_store_log none #我是將這些log記錄都關(guān)了, 有需要的可以將它們打開。
acl managerIP src 10.10.10.10
acl ipcanbrows dst 10.10.10.0/24#acl應(yīng)該是squid配置里面最難理解也最需要花時間的地方了。應(yīng)該說只需要修改很小的一部分就可以了,像這里我只是在原來的基礎(chǔ)上加了2條記錄,前面一條的意思是我定義了10.10.10.10為源路徑,另外一條是指目的端是10.10.10.0/24這個網(wǎng)段。而managerIP,ipcanbrows隨便取得名字。具體的規(guī)則需要下面的語句來定義。10.10.10.10就是本服務(wù)器的內(nèi)網(wǎng)ip,而apache server的ip就在10.10.10.0/24這個網(wǎng)段里,不需要用外網(wǎng)ip,一定程度上節(jié)約了ip地址。
http_access allow manager managerIP ipcanbrows localhost #加上2個允許就可以了。高深的配置我覺得我也不需要,用戶可以訪問就達(dá)到目的了:)
httpd_accel_host virtual #由于我后面的apache server是基于ip來做虛擬主機的,因此這里需要設(shè)置成virtual。
httpd_accel_port 80 #http加速的端口,因為習(xí)慣等原因,還是將后面的apache server監(jiān)聽80端口。
httpd_accel_uses_host_header on #如果選了virtual的話,這里必須設(shè)置成on。
這里最多只列出了5%左右的選項,但是我配置的時候就只是用到了這些,因此,如果做網(wǎng)站加速的話,基本設(shè)置就是這些。當(dāng)然需要更強勁的功能的話就需要好好讀讀squid的配置文件的文檔了。
5. 最后的步驟:
1. 改變var目錄的權(quán)限:chown -R nobody var
2. 創(chuàng)建緩存目錄:sbin/squid -z
3. 啟動squid:bin/RunAccel & (這邊我使用squid附帶的啟動腳本來啟動squid,有個好處就是,如果squid的進(jìn)程死了的話,這個腳本會自動啟動squid,對于運行在線上的服務(wù)器來說,這點太重要了)。
6. 一些使用體會:
1. squid使用時間長了,速度會變慢,我的建議是每2小時kill掉squid 進(jìn)程,RunAccel腳本會自動再啟動的它。
2. 寫一腳本,放進(jìn)crontab中,每天凌晨4點左右把cache目錄清空。
#!/bin/sh
# squid clean swap and restart script by marco lu
SQUID_DIR=/usr/local/squid-10/
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
7. 參考資料:
Squid官方網(wǎng)站: http://www.squid-cache.org