1. 程式人生 > >squid優化及配置引數

squid優化及配置引數

% cd /tmp 
% tar xzvf /some/where/squid-2.5.STABLE4-src.tar.gz 


一些tar 程式不支援z選項,該選項自動解壓gzip 檔案。如果這樣,你需要執行如下命令: 
% gzip -dc /some/where/squid-2.5.STABLE4-src.tar.gz | tar xvf - 


Squid 在高負載下,需要大量的核心資源。特別的,你需要給你的系統配置比正常情況更高的檔案描述符和快取。檔案描述符的限制通常很惱人。你最好在開始編譯squid 之前來增加這些限制的大小。
檔案描述符是一個簡單的整數,用以標明每一個被程序所開啟的檔案和socket。第一個開啟的檔案是0,第二個是1,依此類推。Unix 作業系統通常給每個程序能開啟的檔案數量強加一個限制。更甚的是,unix 通常有一個系統級的限制。 


因 為squid 的工作方式,檔案描述符的限制可能會極大的影響效能。當squid 用完所有的檔案描述符後,它不能接收使用者新的連線。也就是說,用完檔案描述符導致拒絕服務。直到一部分當前請求完成,相應的檔案和socket 被關閉,squid 不能接收新請求。當squid發現檔案描述符短缺時,它會發布警告。 


在執行./configure 之前,檢查你的系統的檔案描述符限制是否合適,能給你避免一些麻煩。大多數情況下,1024 個檔案描述符足夠了。非常忙的cache可能需要4096或更多。在配置檔案描述符限制時,我推薦設定系統級限制的數量為每個程序限制的2 倍。 


通 常在你的Unix shell 中能找到系統的檔案描述符限制。所有的C shell 及其類似的shell有內建的limit 命令。更新的Bourne shell 及其類似的shell 有一條叫做ulimit 的命令。為了發現你的系統的檔案描述符限制,試執行如下命令: 
sh$ ulimit -n
在Linux 上配置檔案描述符有點複雜。在編譯squid 之前,你必須編輯系統include 檔案中的一個,然後執行一些shell 命令。請首先編輯/usr/include/bits/typesizes.h 檔案,改變__FD_SETSIZE 的值: 
#define _ _FD_SETSIZE 8192 


下一步,使用這個命令增加核心檔案描述符的限制: 
# echo 8192 > /proc/sys/fs/file-max 


最後,增加程序檔案描述符的限制,在你即將編譯squid 的同一個shell 裡執行: 
sh# ulimit -Hn 8192 


該命令必須以root 執行,僅僅執行在bash shell。不必重啟機器。 


使用這個技術,你必須在每一次系統啟動後執行上述echo 和ulimit 命令,或者至少在squid 啟動之前。假如你使用某個rc.d 指令碼來啟動squid,那是一個放置這些命令的好地方。
臨時埠是TCP/IP 棧分配給出去連線的本地埠。換句話說,當squid 發起一條連線到另一臺伺服器,核心給本地socket 分配一個埠號。這些本地埠號有特定的範圍限制。 


臨時埠號的短缺對非常忙的代理伺服器(例如每秒數百個連線)來說,會較大的影響效能。這是因為一些TCP 連線在它們被關閉時進入TIME_WAIT 狀態。當連線進入TIME_WATI 狀態時,臨時埠號不能被重用。 


你能使用netstat 命令來顯示有多少個連線進入這個狀態: 


% netstat -n | grep TIME_WAIT 


在Linux 上,簡單的寫一對數字到下列指定檔案: 
# echo "1024 40000" > /proc/sys/net/ipv4/ip_local_port_range 


不要忘記將這些命令加到你的系統啟動指令碼中,以使機器每一次重啟後都生效。
 ls -l /usr/local/squid 
total 5 
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 bin 
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 etc 
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 libexec 
drwxr-x--- 3 wessels wheel 512 Apr 28 20:43 man 
drwxr-x--- 2 wessels wheel 512 Apr 28 20:42 sbin 
drwxr-x--- 4 wessels wheel 512 Apr 28 20:42 share 
drwxr-x--- 4 wessels wheel 512 Apr 28 20:43 var
.4.1 configure 選項 


./configure 指令碼有大量的不同選項,它們以-開始。當你敲入./configure --help 時,能看到選項的完整列表。一些選項對所有configure 指令碼是通用的,還有一些是squid 專有的。下面是你可能用得到的標準選項: 
--perfix =PREFIX 


如前面描述的一樣,這裡設定安裝目錄。安裝目錄是所有可執行檔案,日誌,和配置檔案的預設目錄。在整本書中,$prefix 指你選擇的安裝目錄。 


--localstatedir =DIR 
該選項允許你改變var 目錄的安裝位置。預設是$prefix/var,但也許你想改變它,以使squid 的磁碟快取和日誌檔案被儲存在別的地方。 


--sysconfdir =DIR 
該選項允許你改變etc 目錄的位置。預設的是$prefix/etc。假如你想使用/usr 作為安裝位置,你也許該配置--sysconfdir為/etc. 


以下是squid 的專有./configure選項: 


--enable-dlmalloc[=LIB] 
在 一些系統上,內建的記憶體分配機制(malloc)在使用squid 時表現不盡人意。使用--enable-dlmalloc 選項將squid 原始碼包中的dlmalloc 包編譯和連結進來。假如你的系統中已安裝dlmalloc,你能使用=LIB 引數指定庫的路徑。請見http://g.oswego.edu/dl/html/malloc.html更多關於dlmalloc 的資訊。 


--enable-gnuregex 
在 訪問控制列表和其他配置指令裡,squid 使用正則表示式作為匹配機制。GNU 的正則表示式庫包含在squid 的原始碼包裡;它可以在沒有內建正則表示式的作業系統中使用。./configure指令碼偵察你係統中的正則表示式庫,假如必要,它可以啟用使用GNU正 則表示式。如果因為某些理由,你想強制使用GNU正則表示式,你可以將這個選項加到./configure命令後。 


--enable-carp 
Cache陣列路由協議(CARP)用來轉發丟失的cache到父cache的陣列或cluster。在10.9章有更多關於CARP的細節。 


--enable-async-io[=N_THREADS] 
同 步I/O 是squid 技術之一,用以提升儲存效能。aufs 模組使用大量的執行緒來執行磁碟I/O 操作。該程式碼僅僅工作在linux 和solaris 系統中。=N_THREADS 引數改變squid 使用的執行緒數量。aufs 和同步I/O 在8.4 章中被討論。 
請注意--enable-async-io 是開啟其他三個./configure 選項的快捷方式,它等同於: 
--with-aufs-threads=N_THREADS 
--with-pthreads 
--enable-storeio=ufs,aufs 
--with-pthreads 


該選項導致編譯過程連結到你係統中的P 執行緒庫。aufs 儲存模組是squid 中唯一需要使用執行緒的部分。通常來說,如果你使用--enable-saync-io 選項,那麼不必再單獨指定該選項,因為它被自動激活了。 


--enable-storeio=LIST 
Squid 支援大量的不同儲存模組。通過使用該選項,你告訴squid 編譯時使用哪個模組。在squid-2.5 中,支援ufs,aufs,diskd,和null 模組。通過查詢src/fs 中的目錄,你能得到一個模 
塊列表。 
LIST 是一個以逗號分隔的模組列表,例如: 
% ./configure --enable-storeio=afus,diskd,ufs 


ufs 模組是預設的,看起來問題最少。不幸的是,它效能有限。其他模組可能在某些作業系統中不必編譯。關於squid 儲存模組的完整描述,請見第8章。 
--with-aufs-threads=N_THREADS 


指定aufs 儲存機制使用的執行緒數量(見8.4章)。squid 預設根據快取目錄的數量,自動計算需要使用多少執行緒。 


--enable-heap-replacement 
該選項不再使用,但被保留用於向後相容性。你該使用--enable-removal-policies 來代替。 


--enable-removal-policies=LIST 
排除策略是squid 需要騰出空間給新的cache目標時,用以排除舊目標的機制。squid-2.5支援3個排除策略:最少近期使用(LRU),貪婪對偶大小(GDS),最少經常使用(LFU)。 


然而,因為一些理由,./configure 選項使指定的替代策略和需要執行它們的基本資料結構之間的差別模糊化。LRU是預設的,它以雙鏈表資料結構執行。GDS和LFU使用堆疊的資料結構。 


為了使用GDS 或LFU 策略,你指定: 
% ./configure --enable-removal-policies=heap 


然後你在squid 的配置檔案裡選擇使用GDS或LFU。假如你想重新使用LRU,那麼指定: 
% ./configure --enable-removal-policies=heap,lru 
更多的關於替換策略的細節請見7.5 章。 


--enable-icmp 
如在10.5 章中描述的一樣,squid 能利用ICMP訊息來確定迴環時間尺寸,非常象ping程式。你能使用該選項來啟用這些功能。 


--enable-delay-pools 
延時池是squid 用於傳輸形狀或頻寬限制的技術。該池由大量的客戶端IP 地址組成。當來自這些客戶端的請求處於cache 丟失狀態,他們的響應可能被人工延遲。關於延時池的更多細節請見附錄C。 


--enable-useragent-log 
該選項啟用來自客戶請求的HTTP 使用者代理頭的日誌。更多細節請見13.5 章。 


--enable-referer-log 
該選項啟用來自客戶請求的HTTP referer 日誌。更多細節請見13.4 章。 


--disable-wccp 
Web cache 協調協議(WCCP)是CISCO 的專有協議,用於阻止或分發HTTP 請求到一個或多個caches。WCCP預設被啟用,假如你願意,可以使用該選項來禁止該功能。 


--enable-snmp 
簡單網路管理協議(SNMP)是監視網路裝置和伺服器的流行方法。該選項導致編譯過程去編譯所有的SNMP相關的程式碼,包括一個裁切版本的CMU SNMP庫。 


--enable-cachemgr -hostname[=hostname] 
cachemgr 是一個CGI程式,你能使用它來管理查詢squid。預設cachemgr的hostname值是空的,但你能使用該選項來指定一個預設值。例如: 
% ./configure --enable-cachemgr-hostname=mycache.myorg.net 


--enable-arp-acl 
squid 在一些作業系統中支援ARP,或者以太地址訪問控制列表。該程式碼使用非標準的函式介面,來執行ARP訪問控制列表,所以它預設被禁止。假如你在linux或solaris上使用squid,你可能用的上這個功能。 


--enable-htcp 
HTCP 是超文字快取協議--類似於ICP的內部快取協議。更多細節請見10.8 章。 


--enable-ssl 
使用該選項賦予squid 終止SSL/TLS 連線的能力。注意這僅僅工作在web加速器中用以加速請求。更多細節請見15.2.2 章節。 


--with-openssl[=DIR] 
假如必要,你使用該選項來告訴squid到哪裡找到OpenSSL庫或標頭檔案。假如它們不在預設位置,在該選項後指定它們的父路徑。例如: 
% ./configure --enable-ssl --with-ssl=/opt/foo/openssl 
在這個例子中,你的編譯器將在/opt/foo/openssl/include目錄中找標頭檔案, 在/opt/foo/openssl/lib 中找庫檔案。 


--enable-cache-digests 
Cache 消化是ICP 的另一個替代,但有著截然不同的特性。請見10.7 章。 


--enable-err-languages="lang1 lang2 ..." 
squid 支援定製錯誤訊息,錯誤訊息可以用多種語言報告。該選項指定複製到安裝目錄($prefix/share/errors)的語言。假如你不使用該選項,所 有可用語言被安裝。想知道何種語言可用,請見原始碼包裡errors目錄下的目錄列表。如下顯示如何啟用多種語言: 
% ./configure --enable-err-languages="Dutch German French" ... 


--enable-default-err-language=lang 
該選項設定error_directory 指令的預設值。例如,假如你想使用荷蘭語,你能這樣指定: 
% ./configure --enable-default-err-language=Dutch 
你也能在squid.conf 裡指定error_directory 指令,在附錄A 中有描述。假如你忽略該選項,英語是預設錯誤語言。 


--with-coss-membuf-size=N 
迴圈目錄儲存系統(coss)是squid 的試驗性儲存機制。該選項設定coss 快取目錄的記憶體緩衝大小。注意為了使用coss,你必須在--enable-storeio 選項裡指定儲存型別。 
該引數以位元組形式賦值,預設是1048576 位元組或1M。你能指定2M 緩衝如下: 
% ./configure --with-coss-membuf-size=2097152 


--enable-poll 
unix 提供兩個相似的函式用以在I/O 事件裡掃描開放檔案描述符:select() 和poll()。./configure 指令碼通常能非常好的計算出何時使用poll()來代替select().假如你想強制使用poll(),那麼指定該選項。 
--desable-poll 
類似的,如果不使用poll(),那麼指定該選項。 


--disable-http-violations 
squid 預設可以被配置成違背HTTP協議規範。你能使用該選項來刪除違背HTTP協議的程式碼。 


--enable-ipf-transparent 
在 第9章中,我將描述如何配置squid來攔截快取。一些作業系統使用IP Filter包來協助攔截快取。在這些環境下你應該使用該./configure 選項。如果你使用了該選項,但是編譯器提示src/client_side.c檔案出錯,那是因為IP Filter包沒有或沒有正確的安裝在你的系統中。 


--enable-pf-transparent 
你可能需要指定該選項,使用PF包過濾器在作業系統中攔截HTTP。PF是OpenBSD的標準包過濾器,也可能被髮布到其他系統中。假如你使用該選項,但是編譯器提示src/client_side.c 檔案出錯,那是因為PF 沒有實際安裝到你的系統中。 


--enable-linux-netfilter 
Netfilter 是linux 2.4 系列核心的包過濾器名字。假如你想在linux2.4或以後的版本中使用HTTP攔截功能,那麼啟用該選項。 


--disable-ident-lookups 
ident是一個簡單的協議,允許伺服器利用客戶端的特殊TCP連線來發現使用者名稱。假如你使用該選項,編譯器將把執行這些查詢的程式碼排除出去。即使你在編譯時保留了這些程式碼,除非你在squid.conf檔案裡指定,squid不會執行ident查詢。 


--disable-internal-dns 
squid 原始碼包含兩個不同的DNS 解決方案,叫做“內部的”和“外部的”。內部查詢是預設的,但某些人可能要使用外部技術。該選項禁止內部功能,轉向使用舊的方式。 
內部查詢使用squid自己的DNS協議執行工具。也就是說,squid產生未完成的DNS查詢並且將它們傳送到一個解析器。假如超時,它重新發送請求,你能指定任意數量的解析器。該工具的有利處之一是,squid獲得準確無誤的DNS響應的TTLs。 
外 部查詢利用C庫的gethostbyname()和gethostbyaddr()函式。squid使用一個外部程序池來製造並行查詢。使用外部DNS 解析的主要弊端是你需要更多的輔助程序,增加squid的負載。另一個麻煩是C 庫函式不在響應裡傳輸TTLs,這樣squid使用postive_dns_ttl 指令提供的一個常量值。 


--enable-truncate 
truncate ()系統呼叫是unlink()的替代品。unlink()完全刪除cache 檔案,truncate()將檔案大小設為零。這樣做釋放了分配給該檔案的磁碟空間,但留下適當的目錄介面。該選項存在的理由是,某些人相信(或希望) truncate()比unlink()效能表現更好。然而,壓力測試顯示兩者有很少的或根本沒有區別。 


--disable-hostname-checks 
預設的,squid要求URL主機名在一定程度上遵守古老的RFC 1034 規範: 
標籤必須遵循下列ARPANET 主機名規則。它們必須以字母開始,以字母或數字結尾,僅僅包含字母,數字和下劃線。 
這裡字母意味著ASCII字元,從A到Z。既然國際域名日益流行,你可能希望使用該選項來移除限制。 


--enable-underscores 
該 選項控制squid針對主機名裡下劃線的行為。通用的標準是主機名裡不包含下劃線字元,儘管有些人不贊成這點。squid預設會對URL主機名裡帶下劃線 的請求產生一條錯誤訊息。你能使用該選項,讓squid信任它們,把它們當作合法的。然而,你的DNS解析器也許強迫使用非下劃線請求,並且對帶下劃線的 主機名解析失敗。 


--enable-auth[=LIST] 
該選項控制在squid的二進位制檔案裡支援哪種驗證機制。你能選擇下列機制的任意組合: 
basic,digest,ntlm。假如你忽略該選項,squid 僅僅支援basic 驗證。假如你使用不帶引數的--enable-auth選項,編譯程序將增加對所有驗證機制的支援。你可以使用以逗號分隔的驗證機制列表: 
% ./configure --enable-auth=digest,ntlm 
我在第六章和第十二章裡會談得更多。 


--enable-auth-helpers=LIST 
這個舊選項現在已捨棄了, 但為了保持向後相容性仍保留著。你可以使用--enable-basic-auth-helperes=LIST 來代替。 


--enable-basic-auth-helpers=LIST 
使用該選項,你能將helpers/basic_auth 目錄的一個或多個HTTP Basic驗證輔助程式編譯進來。請見12.2章找到它們的名字和描述。 


--enable-ntlm-auth-helpers=LIST 
使用該選項,你能將helpers/ntlm_auth 目錄的一個或多個HTTP NTLM驗證輔助程式編譯進來。請見12.4章找到它們的名字和描述。 


--enable-digest-auth-modules=LIST 
使用該選項,你能將helpers/digest_auth 目錄的一個或多個HTTP Digest驗證輔助程式編譯進來。請見12.3章找到它們的名字和描述。 


--enable-external-acl-helpers=LIST 
使用該選項,你能編譯一個或多個擴充套件ACL輔助程式,這些在12.5章中討論。例如: 
% ./configure --enable-external-acl-helpers=ip_user,ldap_group 


--disable-unlinkd 
unlinkd 是另一個squid的外部輔助程序。它的基本工作是對cache檔案執行unlink()或truncate()系統呼叫。通過在外部程序裡執行檔案刪除工作,能給squid帶來明顯的效能提升。使用該選項來禁止外部unlink程序功能。 


--enable-stacktrace 
某些系統支援在程式崩潰時,自動產生資料追蹤。當你啟用該功能後,如果squid崩潰,資料追蹤資訊被寫到cache.log檔案。這些資訊對開發和程式bug除錯有用。 


--enable-x-accelerator-vary 
該高階功能可能在squid被配置成加速器時使用。它建議squid在響應請求時,從後臺原始伺服器中尋找X-Accelerator-Vary頭。
在安裝完後,你將在squid 的安裝目錄裡(預設是/usr/local/squid)見到下列目錄和檔案: 


sbin 
sbin 目錄的程式正常只能被root 啟動 


sbin/squid 
Squid 的主程式 


bin 
bin 目錄包含對所有使用者可用的程式 


bin/RunCache 
RunCache 是一個shell指令碼,你能用它來啟動squid。假如squid死掉,該指令碼自動重啟它,除非它檢測到經常的重啟。RunCache是一個時間遺留的產 物,那時Squid還不是後臺服務程序。在最近的版本里,RunCache很少用到,因為Squid自動重啟它自身,當你不使用-N選項時。 


bin/RunAccel 
RunAccel 與RunCache 幾乎一致,唯一的不同是它增加了一個命令列引數,告訴squid在哪裡偵聽HTTP 請求。 


bin/squidclient 
squidclient 是個簡單的HTTP 客戶端程式,你能用它來測試squid。它也有一些特殊功能,用以對執行的squid 程序發起管理請求。 


libexec 
libexec 目錄傳統的包含了輔助程式。有一些命令你不能正常的啟動。然而,這些程式通常被其他程式啟動。 


libexec/unlinkd 
unlinkd是一個輔助程式,它從cache目錄裡刪除檔案。如你後面看到的一樣,檔案刪除是個效能瓶頸。通過在外部程序裡執行刪除操作,Squid提升了一些執行效能。 


libexec/cachemgr.cgi 
cachemgr.cgi是Squid管理功能的CGI介面。為了使用它,你需要拷貝該程式到你的WEB伺服器的cgi-bin目錄。在14.2章中有更多描述。 


libexec/diskd(optional) 
假如你指定了--enable-storeio=diskd,你才能看到它。 


libexec/pinger(optional) 
假如你指定了--enable-icmp,你才能看到它。 


etc 
etc 目錄包含squid 的配置檔案。 


etc/squid.conf 
這是squid的主要配置檔案。初始的該檔案包含了大量的註釋,用以解釋每一個選項做什麼。在你理解了這些配置指令後,建議你刪除這些註釋,讓配置檔案更小和更容易閱讀。注意假如該檔案存在,安裝過程不會覆蓋該檔案。 


etc/squid.conf.default 
這是從原始碼目錄中拷貝過來的預設配置檔案。在升級了squid安裝後,你也許發現有一份當前預設配置檔案的拷貝是有用的。可能會增加新的配置指令,一些存在的舊指令可能有所改變。 


etc/mime.conf 
mime.conf檔案告訴squid 對從FTP和Gopher伺服器獲取的資料使用何種MIME型別。該檔案是一個關聯檔名擴充套件到MIME型別的表。正常而言,你不必編輯該檔案。然而,你可能需要增加特殊檔案型別的介面,它們在你的組織內使用。 


etc/mime.conf.default 
這是從原始碼目錄裡拷貝過來的預設mime.conf檔案。 


share 
share目錄通常包括squid的只讀資料檔案。 


share/mib.txt 
這是squid的SNMP管理資訊基礎(MIB)檔案。squid自身不使用該檔案,然而,你的SNMP客戶端軟體(例如snmpget和多路由走向圖(MRTG))需要該檔案,用以理解來自squid的SNMP物件可用。 


share/icons 
share/icons目錄包含大量的小圖示檔案,squid用在FTP和Gopher目錄列舉裡。正常而言,你不必擔心這些檔案,但如果需要,你可以改變它們。 


share/errors 
share/errors 目錄包含了squid顯示給使用者看的錯誤訊息模板。這些檔案在你安裝squid時,從原始碼目錄拷貝而來。如果需要你可以編輯它們。然而,在每次執行 make install時,安裝過程總會覆蓋它們。所以假如你想定製錯誤訊息,建議你把它們放在不同的目錄。 


var 
var目錄包含了不是很重要的和經常變化的檔案。這些檔案你不必正常的備份它們。 


var/logs 
var/logs目錄是squid 不同日誌檔案的預設位置。當你第一次安裝squid 時,它是空的。一旦squid開始執行,你能在這裡看到名字為access.log,cache.log和store.log這樣的檔案。 


var/cache 
假如你不在squid.conf檔案裡指定,這是預設的快取目錄(cache_dir)。