Squid Proxy Server 之架設
國立中山大學資訊工程研究所 梁明章
目錄
一、硬體設備之選擇 二、作業系統之選擇 三、Proxy Server 之選擇 四、簡易安裝、設定與維護 五、進階:Squid 之架構原理與聯合運作 六、進階:增進效能的方法 七、進階:自動維護的方式
一、硬體設備之選擇
選擇重點:
記憶體與硬碟:
512MB Ram 搭配 45GB 硬碟 負荷越高、使用者越多的 Proxy 頇降低硬碟容量 反之,較輕鬆的 Proxy 可以用較少記憶體配較大的硬碟量 硬碟單顆容量不要太大,4 ~ 9GB即可,轉速要快 每個分割區大小適中(建議 2 ~ 4GB) 可以的話,多用幾張SCSI卡分散硬碟,加快IO處理速度
IO速度:
CPU
不一定要超級快,但是多顆會比單顆好,尤其是用Multi Threads的時候,多顆CPU會特別有效
中山proxy配備詳細規格(自組PC)
MainBoard: ASUS P2BD CPU: Intel PentiumII 450 (x2) RAM: 168Pin SDRAM 256MB (x4) SCSI: AHA2940UW (x2) HD: IBM-DDRS39130 (x7)
以上僅供參考,非廣告,請自行選購搭 配穩定之配法。
二、作業系統之選擇
三種免費的Unix可選擇:
Linux(建議 RedHat 6.0 以上,架構較大) FreeBSD 3.x Solaris 8 x86
若是主機有多顆CPU的話,建議採用Multi Threads最穩定成熟的Solaris8 若是主機僅有單顆CPU,Linux、FreeBSD速度 較快,但必頇注意各種極限值的放大
三、Proxy Server 之選擇
免費又強大的 Squid 2.x
現今世界上網路中心的 Proxy 多為 Unix 系 統,所採用的 Server 也以 Squid 居多,同 樣使用 Squid,設定搭配較為容易 使用者眾多、研究文獻多、經驗交流文章多 功能強大,可以做出許多複雜的功能組合以 及精密的控制 網路上關於 Squid 的各種分析器程式隨手可 得,有助於分析與研究
四、簡易安裝、設定與維護
1.取得 Source: http://squid.nlanr.net/Squid/ http://ftp.nsysu.edu.tw/Unix/Proxy/squid/source/
2.版本辨識:
Squid-主版本.副版本-更新版次-src.tar.gz 更新版次順序(舊->新):Pre -> Stable -> Patch 範例(從舊到新):
Squid-2.1-patch2-src.tar.gz Squid-2.2-stable-src.tar.gz Squid-2.2-patch1-src.tar.gz
最好別使用發展中的 Pre、Dev 等版本
3.編譯與安裝: cd /usr/local/src gzip –d squid-2.3-stable2-src.tar.gz | tar xf – cd squid-2.3-stable2 ./configure --help (以此參數看看有哪些編譯選項可以使用) env CFLAGS='-O2 -mpentiumpro -mcpu=pentiumpro‘ ./configure --host=i686-pc-solaris2.8 --prefix=/home/squid --enable-dlmalloc --enable-gnuregex --enable-async-io=160 --enable-kill-parenthack --enable-cachemgr-hostname=proxy1.nsysu.edu.tw -enable-cache-digests --enable-err-language=Traditional_Chinese --enable-poll --disable-ident-lookups --enable-heap-replacement make make install
4.設定
cd /home/squid/etc ; vi squid.conf 範例可參考 http://proxy.nsysu.edu.tw/squid.conf
5.維護
關機或reboot必頇依照下列程序:
/home/squid/bin/squid –k shutdown tail /home/squid/logs/cache.log 確認 squid process 已正常exit System shutdown or reboot
Access.log 會非常大,尤其是區網中心的proxy,務必注 意剩餘空間,一旦log無法寫入,squid 會停住
/home/squid/bin/squid –k rotate 可以更換 log file
/home/squid/bin/squid –k reconfigure 可即時更新設定
五、進階:Squid 之架構原理與聯合運作
Squid 的基本概念
Squid server 之間的關係
Squid server 的架構
第一種 Loading Share 方式
第二種 Loading Share 方式
網頁
Proxy Only Group
Proxy.kpp.edu.tw 163.28.130.1
Exchange Digest Table Proxy.kpp.edu.tw 163.28.130.2
Proxy.kpp.edu.tw 163.28.130.3
Exchange Digest Table
Exchange Digest Table
下游的 Proxy
End Users
目前中山的 Loading Share 方式
CCProxy1.nsysu.edu.tw
Proxy1.nsysu.edu.tw
Proxy2.nsysu.edu.tw
CCProxy2.nsysu.edu.tw
Proxy.nsysu.edu.tw
CCProxy.nsysu.edu.tw
國內
國外
Proxy Auto Configure
目前中山的 Loading Share 方式
Proxy1.nsysu.edu.tw 的設定:
cache_peer cache_peer cache_peer cache_peer cache_peer cache_peer proxy2.nsysu.edu.tw sibling 3128 3130 no-query proxy-only ccproxy1.nsysu.edu.tw sibling 3128 3130 no-query proxy-only ccproxy2.nsysu.edu.tw sibling 3128 3130 no-query proxy-only w3-cache1.nctu.edu.tw sibling 3128 3130 no-query no-netdb-exchange w3-cache2.nctu.edu.tw sibling 3128 3130 no-query no-netdb-exchange w3-cache3.nctu.edu.tw sibling 3128 3130 no-query no-netdb-exchange
cache_peer_access proxy2.nsysu.edu.tw allow all cache_peer_access ccproxy1.nsysu.edu.tw allow all cache_peer_access ccproxy2.nsysu.edu.tw allow all cache_peer_access w3-cache1.nctu.edu.tw allow all cache_peer_access w3-cache2.nctu.edu.tw allow all cache_peer_access w3-cache3.nctu.edu.tw allow all
六、進階:增進效能的方法
最佳化編譯器
GCC(EGCS)or PentiumGCC GCC-2.95以上已經改為EGCS-2.95,如果CPU是Intel Pentium 以上,則PGCC的效能可能會較好,但是PGCC不一定會穩定, 因此,如果你的系統無法穩定的使用PGCC,請勿強求,使用 EGCS即可。 以上三種編譯器,皆可在下列位址取得Source
http://ftp.nsysu.edu.tw/Unix/GNU/ 因為頇與系統緊密契合,所以binary code移植性低,最好是在本 機進行編譯,且在本機使用 如果有某項周邊搭配不佳,會提高當掉的機率 系統管理者的功力會有很大的影響,必頇正確的做好最佳化編譯 器以及最佳化的系統環境,否則程式會容易當 穩定的話,盡量使用最佳化參數,如 -O2, -mpentiumpro 等等。
最佳化編譯器有幾個特點要注意:
調整作業系統環境 放大極限值:squid server 僅有一隻,因此,需要調大 fd_open num per process,如果使用MultiThreads,還要注意Threads上限 Solaris 8 Edit /etc/system 加入下列數行,reboot後即可生效 set maxusers=256 set rlim_fd_max = 8192 threads 上限不頇調整 Linux 修改/usr/src/linux/include/linux 下與極限相關的含括檔 limits.h :
#define OPEN_MAX 4096 /* open files a process may have */
Rebuild kernel FreeBSD 3.2以上 fd_open max 無限制
使用 Multi Threads
./configure --enable-async-io=80 只要在編譯前的 configure 加入如上的選項,就可以啟動 Multi Threads 功能,後面的80表示提高threads數量到80個,此數字請自行參酌,請注 意,只有squid-2.3 以上才能在configure參數指定threads number, squid-2.2必頇修改source code的#define。 注意事項: Squid 會詴圖使用 pthread lib,請先確定貴系統是否有此 lib,而且, pthread 穩定又成熟的Unix系統並不多,請特別注意觀察穩定性,若 是pthread不穩定,請考慮更換作業系統,或是不使用pthread,但是 如此一來多CPU主機也失去意義了。 目前大部分的系統雖然有 pthread lib,但是有些系統雖然可以在多 CPU的主機上執行,但是實際上並未妥善利用多CPU的資源,無法有 顯著的效能增進,必頇選擇能「真正」使用到多CPU的作業系統。
字串處理函式庫
Squid 大量使用字串處理做各種判斷,因此必頇使用更好的 regex lib, 推薦使用 GNU 的 GNUregex lib 在編譯前加此參數即可 link GNUregex
./configure --enable-gnuregex
記憶體處理函式庫
Squid 為了快速反應 user reguest,在轉達檔案時是在RAM裡面做轉送, 因此常常在做 Memory Allocate & Free 的動作,所以,Memory Lib 的效 能對整體 Proxy 效能的影響非常大,推薦使用下列二種 Memory LIB:
GNUmalloc: source 在下列位址
http://ftp.nsysu.edu.tw/Unix/GNU/gnu/malloc.tar.gz ./configure --enable-dlmalloc
Dlmalloc: 在編譯前多加下列參數即可使用
以上兩者只能擇一使用,不能共用 GNUmalloc 擅長於常駐型 daemon 的記憶體配置與釋放,功能陽春但速度很快 Dlmalloc 具備一些 debug & status report 的便利,算是各方面表現皆中上的優秀函式庫
硬碟之規劃
每顆硬碟容量別太大,以免發生過度集中的現象 (建議別超過9GB) (此建議是針對沒有Raid的) 每個 Partition 別太小,會造成浪費,但是也別太大, 會使尋找檔案的速度變慢(建議在2~4GB之間) 最好一個 cache_dir 就是一個分割區,不要混在一起 系統、Swap、記錄檔所在的硬碟最好跟Cache資料 硬碟分開在不同硬碟上,不要互相干擾使用空間 以 Proxy 使用硬碟的方式,搜尋速度遠比直線存取 速度重要的多,所以建議轉速別太低,機械臂要能 忍耐極度頻繁的移動,所以發熱也大,頇選較低溫 的硬碟,以上為選購硬碟時的重點。
Cache_dir 的規劃
Cache 的一些演算式如下 Bucket數 = CacheDir * Level1_Dir * Level2_Dir 總檔案數 = Bucket * FilesPerBucket 檔案平均大小 = Cache總容量 / 總檔案數量
原則:
Level1 & Level2 的 Dir File Size 最好不超過 1024 Bytes,也就是說 每層目錄下不要有太多的子目錄或檔案。 Level1, Level2, FilesPerBucket 三個數字最好差不多大,才不會造成 某個數字偏大。 檔案平均大小無一定的決定規則,因使用者習慣而異,先估計出檔案 平均大小,再計算出總檔案數量,接著再去計算各層目錄與檔案數。 可以的話,盡量用16的倍數。 Bucket數量不要超過65536
Cache_dir 的規劃(舉例)
HD: 9GB * 7 Partition: 2.85GB(9GB / 3) Mean Object Size: 20KB 2850000/20 = 142500(file number per partition) 142500 = Level1 * Level2 * FilesPerBucket = 48 * 64 * 48 Buckets = partition * level1 * level2 = 21 * 48 * 64 = 64512
(buckets沒超過 65536,且48,64,48三個數字都不大,it’s nice)
其他重要原則
Cache 必頇一直維持著足夠的空間來容納新進入的檔案,否 則將使新檔堆積在RAM內而耗盡資源或大量swap,因此, Objects 的 expire 砍檔速度不能慢於新進檔案的成長速度,基 於這個理由,有下列方式可以嘗詴: 拉開cache容量的高水標與低水標
cache_swap_low 80 cache_swap_high 95
加快 LRU expire 的頻率
決定總檔案數量之後,可得到每個Partition內的檔案數量,再依 此format該partition的inode到適當的數量,過多、不足都不好。 parent 別設太多,設三四個效率好又擊中率高的友站即可,設多 了不只浪費頻寬,拖慢自己速度也拖慢別人
其他重要原則
Sibling的技術很重要,如果對方有允許抓取cache digest table,最好使用no-query選項,這樣對方沒 有的東西就不會用 ICP_QUERY 去問了。 盡量減少無法交換 cache digest table 的 sibling, 因為這種 sibling 只能用 ICP_QUERY。 Cache digest + no-query 的聯合應用,可以強制 proxy 只抓取 sibling 已經有的東西,不但節省頻寬, 且可省掉許多落空的 ICP_QUERY,也可提高 sibling 的 Hit Rate,一舉數得。