欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

<-
Apache > HTTP Server > 文檔 > 版本2.2
   致謝 | 譯者聲明 | 本篇譯者:金步國(guó) | 本篇譯稿最后更新:2006年1月1日 | 獲取最新版本

緩沖指南

這篇文檔是對(duì)mod_cache、mod_disk_cachemod_mem_cache、mod_file_cachehtcacheclean參考文檔內(nèi)容的增補(bǔ)。它描述了如何利用Apache的緩沖特性來加速web和代理(proxy)服務(wù),同時(shí)避免一些常見的問題和配置錯(cuò)誤。

top

簡(jiǎn)介

從Apache2.2起,mod_cachemod_file_cache將不再是試驗(yàn)?zāi)K,它們已經(jīng)足夠穩(wěn)定,可以用于實(shí)際生產(chǎn)中了。這些緩沖體系提供了一個(gè)強(qiáng)有力的途徑來加速原始web服務(wù)器(origin webserver)和代理服務(wù)器(proxy)的HTTP處理速度。

mod_cache以及它的支持模塊mod_mem_cachemod_disk_cache提供了智能的HTTP緩沖。內(nèi)容(content)本身被存儲(chǔ)在緩沖區(qū)中,mod_cache的目的在于管理控制內(nèi)容緩沖能力的各種HTTP頭和選項(xiàng)。它可以同時(shí)處理本地的內(nèi)容和代理的內(nèi)容。mod_cache被設(shè)計(jì)為同時(shí)針對(duì)簡(jiǎn)單的和復(fù)雜的緩沖配置,以用于處理代理的內(nèi)容、動(dòng)態(tài)的本地內(nèi)容、必須加速訪問的隨時(shí)間而改變本地文件。

另一方面,mod_file_cache實(shí)現(xiàn)了一個(gè)更基本的、但是在某些情況下更有效的緩沖形式,它避免了主動(dòng)確保URL緩沖能力所需的維護(hù)復(fù)雜性,mod_file_cache通過提供文件句柄(file-handle)和內(nèi)存映射(memory-mapping)的技巧來維持一個(gè)自Apache最后一次啟動(dòng)以來的文件緩沖區(qū)。同樣地,mod_file_cache的目標(biāo)是改善不常修改的本地靜態(tài)文件的訪問時(shí)間。

由于mod_file_cache提供了一個(gè)相對(duì)簡(jiǎn)單的緩沖實(shí)現(xiàn),除了CacheFileMMapStatic文檔的特定段落之外,這篇指南的說明覆蓋了mod_cache的緩存體系結(jié)構(gòu)。

為了更好的理解這篇文檔,你應(yīng)當(dāng)熟悉HTTP的基礎(chǔ)知識(shí),并且已經(jīng)閱讀過從URL到文件系統(tǒng)的映射內(nèi)容協(xié)商這兩篇用戶指南。

top

緩沖概述

在一個(gè)請(qǐng)求的生存期中,mod_cache內(nèi)可能會(huì)發(fā)生兩個(gè)主要階段。首先,mod_cache將是一個(gè)URL映射模塊,也就是說,如果一個(gè)URL已經(jīng)被緩存并且這個(gè)緩存尚未失效,該請(qǐng)求將由mod_cache直接處理。

這也意味著在處理一個(gè)請(qǐng)求時(shí)通常還要發(fā)生的其他階段:比如由mod_proxymod_rewrite處理的階段,將不會(huì)發(fā)生。不過,這正是將內(nèi)容緩存起來的關(guān)鍵所在。[雖然某些階段被省略了,但這正是啟用緩沖特性的初衷:減少處理步驟以提高速度。]

如果這個(gè)URL不在緩存中,mod_cache將會(huì)在請(qǐng)求的處理過程中添加一個(gè)過濾器。在Apache使用通常的方法定位內(nèi)容之后,該過濾器將會(huì)在內(nèi)容被用于服務(wù)以后運(yùn)行。如果該內(nèi)容被確定為可以緩存,那么它將被保存在緩沖區(qū)中以便為將來的請(qǐng)求提供服務(wù)。

如果該URL存在于緩存中并且已經(jīng)失效的話,該過濾器同樣會(huì)被添加,但是mod_cache將會(huì)同時(shí)向后端(backend)提交一個(gè)條件請(qǐng)求以確定緩存的版本是否是當(dāng)前的最新版本。如果是最新版本,那么它的元信息(meta-information)將會(huì)被更新并且使用這個(gè)緩存的版本來服務(wù)于該請(qǐng)求。如果不是最新版本,那么過濾器將使用剛才為請(qǐng)求提供服務(wù)的最新內(nèi)容更新緩存。

提高緩存命中率

在緩存本地生成的內(nèi)容的時(shí)候,將UseCanonicalName指令設(shè)置為 On 可以顯著提高緩存的命中率。這是由于為緩沖區(qū)提供內(nèi)容的虛擬主機(jī)的主機(jī)名是緩沖鍵(cache key)的組成部分。當(dāng)該指令設(shè)置為 On 時(shí),具有多個(gè)服務(wù)器名或別名的虛擬主機(jī)將不會(huì)產(chǎn)生不同的緩存實(shí)體,而是按照各自的規(guī)范主機(jī)名(canonical hostname)來存儲(chǔ)。

由于緩存發(fā)生在將URL映射到文件系統(tǒng)的階段,緩存的文檔將只被用來響應(yīng)對(duì)URL的請(qǐng)求。通常情況下這沒什么重大意義,但是當(dāng)你使用服務(wù)端包含(Server Side Includes)時(shí),這一點(diǎn)將顯得特別重要:

<!-- 下面的包含可以被緩存 -->
<!--#include virtual="/footer.html" --> 

<!-- 下面的包含不可以被緩存 -->
<!--#include file="/path/to/footer.html" -->

如果你使用服務(wù)端包含(SSI),并且希望從緩沖中獲得快速服務(wù)好處,你應(yīng)當(dāng)使用virtual類型的包含。

失效周期(Expiry Periods)

緩存實(shí)體的默認(rèn)失效周期是一個(gè)小時(shí)(3600秒),當(dāng)然這個(gè)可以輕易的通過CacheDefaultExpire指令來修改。這個(gè)默認(rèn)值僅僅用在產(chǎn)生內(nèi)容的原始資源沒有明確指定失效時(shí)間或最后修改時(shí)間的情況下。

如果一個(gè)應(yīng)答沒有包含Expires頭但卻包含Last-Modified頭時(shí),mod_cache可以根據(jù)CacheLastModifiedFactor指令推斷出失效周期。

對(duì)于本地內(nèi)容,mod_expires可以用來調(diào)整失效周期。

失效周期的最大值還可以通過CacheMaxExpire指令來控制。

關(guān)于條件請(qǐng)求(Conditional Request)的簡(jiǎn)短說明

當(dāng)緩存的內(nèi)容失效并且被從后端(backend)或內(nèi)容提供者(content provider)那里重新請(qǐng)求的時(shí)候,Apache并不直接傳遞原始的請(qǐng)求,而是使用一個(gè)條件請(qǐng)求(conditional request)。

HTTP協(xié)議使用的一些頭(header)允許客戶端或緩沖區(qū)鑒別同一個(gè)內(nèi)容的不同版本。例如,如果一個(gè)資源應(yīng)答了"Etag:"頭,那么就可以生成一個(gè)包含"If-Match:"頭的條件請(qǐng)求;如果一個(gè)資源應(yīng)答了"Last-Modified:"頭,那么就可以生成一個(gè)包含"If-Modified-Since:"頭的條件請(qǐng)求;等等。

對(duì)于這樣的條件請(qǐng)求,應(yīng)答的不同取決于內(nèi)容是否匹配這些條件。如果一個(gè)請(qǐng)求包含一個(gè)"If-Modified-Since:"頭,而請(qǐng)求的內(nèi)容在指定的時(shí)間之后并未發(fā)生改變,那么一個(gè)簡(jiǎn)潔的"304 Not Modified"應(yīng)答就可以了。

如果請(qǐng)求的內(nèi)容已經(jīng)變化,那么將按照原來沒有條件請(qǐng)求的普通方式來應(yīng)答。

和緩存相關(guān)的條件請(qǐng)求的好處有兩個(gè)方面。首先,當(dāng)向后端提交這樣的條件請(qǐng)求時(shí),如果從后端獲得的內(nèi)容與存儲(chǔ)的內(nèi)容相匹配(這很容易確定),就可以避免由于傳遞全部資源所帶來的開銷。

其次,條件請(qǐng)求通常只讓后端花費(fèi)較小的開銷。對(duì)于靜態(tài)文件,通常所有的開銷就是一個(gè)stat()或類似的系統(tǒng)調(diào)用以確定改文件的大小是否變化以及最后修改時(shí)間。這樣,如果被請(qǐng)求的內(nèi)容尚未變化,甚至在Apache緩存的本地內(nèi)容已經(jīng)失效的情況下,仍然可以從緩沖區(qū)中快速取得以服務(wù)于請(qǐng)求——只要從緩沖區(qū)讀取比從后端讀取更快(例如從內(nèi)存緩沖區(qū)讀取就比從硬盤上讀取更快)。

什么可以被緩存?

如前所述,Apache中的緩沖存在兩種不同工作方式。mod_file_cache的緩沖區(qū)負(fù)責(zé)維護(hù)Apache啟動(dòng)時(shí)的文件內(nèi)容。當(dāng)一個(gè)存在于該模塊緩沖區(qū)中的文件被請(qǐng)求時(shí),該請(qǐng)求將被攔截并用緩沖區(qū)中的內(nèi)容為其提供服務(wù)。

mod_cache的緩沖區(qū)相對(duì)而言較為復(fù)雜。當(dāng)服務(wù)于一個(gè)請(qǐng)求時(shí),如果它先前并未被緩存,則緩沖模塊將會(huì)判斷該內(nèi)容是否可以被緩存。判斷應(yīng)答的緩沖能力(cachability)基于以下條件:

  1. 必須為該URL啟用了緩沖。請(qǐng)參考CacheEnableCacheDisable指令。
  2. 應(yīng)答必須具有如下HTTP狀態(tài)碼:200, 203, 300, 301, 410 。
  3. 該請(qǐng)求必須是一個(gè)HTTP GET請(qǐng)求。
  4. 如果請(qǐng)求包含"Authorization:"頭,則應(yīng)答不被緩存。
  5. 如果應(yīng)答包含"Authorization:"頭,它必須同時(shí)也在"Cache-Control:"頭中包含"s-maxage"、"must-revalidate"或"public"選項(xiàng)。
  6. 如果該URL包含一個(gè)請(qǐng)求字符串(比如來自于一個(gè)使用GET方法的HTML表格),除非應(yīng)答包含"Expires:"頭,否則將不被緩存。這是基于RFC2616的13.9小節(jié)的規(guī)范。
  7. 如果應(yīng)答的狀態(tài)碼是200(OK),除非明確打開了CacheIgnoreNoLastMod指令,否則該應(yīng)答還必須至少包含一個(gè)"Etag"、"Last-Modified"或"Expires"頭才能被緩存。
  8. 如果應(yīng)答頭"Cache-Control:"中包含"private"選項(xiàng),除非明確打開了CacheStorePrivate指令,否則將不被緩存。
  9. 同樣,如果應(yīng)答頭"Cache-Control:"中包含"no-store"選項(xiàng),除非明確打開了CacheStoreNoStore指令,否則將不被緩存。
  10. 如果應(yīng)答包含"Vary:"頭,并且其中包含通配符"*"(匹配所有),也將不被緩存。

什么不應(yīng)該被緩存?

簡(jiǎn)而言之,隨時(shí)間變化的內(nèi)容不應(yīng)該被緩存;取決于特定請(qǐng)求的內(nèi)容不應(yīng)該被緩存;依賴于不被HTTP內(nèi)容協(xié)商處理的請(qǐng)求的內(nèi)容也不應(yīng)該被緩存。[本句翻譯的很沒把握,原文:In short, any content which is highly time-sensitive, or which varies depending on the particulars of the request that are not covered by HTTP negotiation, should not be cached.]

如果你有某些動(dòng)態(tài)內(nèi)容,它們的變化依賴于請(qǐng)求發(fā)起者的IP地址或者差不多每5分鐘就會(huì)發(fā)生改變,那么這些內(nèi)容毫無疑問是不應(yīng)該被緩存的。

另一方面,如果內(nèi)容的變化依賴于各種HTTP頭,更加明智的做法可能是通過使用"Vary"頭進(jìn)行緩存。

易變的/協(xié)商的內(nèi)容

當(dāng)mod_cache接收到一個(gè)后端發(fā)出的、帶有"Vary"頭的應(yīng)答的時(shí)候,它將盡可能智能的處理它。如果有機(jī)會(huì),mod_cache將會(huì)檢查之后進(jìn)入的請(qǐng)求的"Vary"頭屬性,然后用正確的緩沖區(qū)內(nèi)容為這個(gè)請(qǐng)求提供服務(wù)。

舉個(gè)例子來說,接收到一個(gè)帶有如下"Vary"頭的應(yīng)答:

Vary: negotiate,accept-language,accept-charset

mod_cache將只會(huì)使用與原始請(qǐng)求的accept-language和accept-charset頭匹配的緩存內(nèi)容來提供服務(wù)。

top

安全方面的考慮

授權(quán)(Authorisation),訪問控制(Access & Control)

mod_cache非常像一個(gè)內(nèi)置的反向代理(reverse-proxy)。除非必須要向后端提交請(qǐng)求,否則緩沖模塊將直接為請(qǐng)求提供服務(wù)。對(duì)于緩沖本地資源,這種模式徹底改變了Apache的安全模型。

因?yàn)楸闅v文件系統(tǒng)的目錄結(jié)構(gòu)以尋找可能存在的.htaccess文件是一個(gè)開銷非常昂貴的操作,它部分地抵消了緩沖所帶來的好處(加速請(qǐng)求),所以mod_cache并不檢查緩存中的實(shí)體是否被允許(authorised)用于提供服務(wù)。換句話說,只要mod_cache中緩存的內(nèi)容尚未失效,那么它們將被直接用于為請(qǐng)求提供服務(wù)。

舉例來說,如果你為某個(gè)資源按照IP地址配置了訪問許可,你必須要確保這些內(nèi)容不被緩存。你可以使用CacheDisable指令或mod_expires模塊達(dá)到這個(gè)目的。不做權(quán)限檢查的mod_cache模塊非常像一個(gè)反向代理:緩存內(nèi)容并用緩存的內(nèi)容向任意IP地址上的任意客戶提供服務(wù)。

本地利用(Local exploits)

因?yàn)榻K端用戶的請(qǐng)求可以由緩沖區(qū)直接提供服務(wù),所以緩沖區(qū)自身便成為一個(gè)那些企圖干擾、破壞內(nèi)容的攻擊者的攻擊目標(biāo)。很重要的、需要牢記的一點(diǎn)是:緩沖區(qū)必須始終對(duì)運(yùn)行Apache的用戶是可寫的。這正好與通常的原則:始終保持所有內(nèi)容對(duì)運(yùn)行Apache的用戶不可寫,完全相反!

如果運(yùn)行Apache的用戶是潛在的不安全用戶,比如,通過一個(gè)有漏洞的CGI進(jìn)程,就有可能對(duì)緩沖區(qū)發(fā)起攻擊,當(dāng)使用mod_disk_cache的時(shí)候,就很容易插入或者修改緩沖區(qū)中內(nèi)容。

這樣一來,運(yùn)行Apache的用戶就會(huì)增加一個(gè)與其它類型的攻擊相比更加危險(xiǎn)的安全隱患。如果你正在使用mod_disk_cache ,你必須時(shí)刻牢記:確保為Apache及時(shí)打上所有的安全補(bǔ)丁并且使用suEXEC以一個(gè)不同于運(yùn)行Apache用戶的其他用戶身份運(yùn)行CGI進(jìn)程。

緩存中毒(Cache Poisoning)

當(dāng)將Apache作為一個(gè)緩沖代理服務(wù)器運(yùn)行的時(shí)候,將可能存在一個(gè)所謂"緩存中毒"的問題。"緩存中毒"是一個(gè)泛稱術(shù)語(yǔ),用于指代各種造成代理服務(wù)器從后臺(tái)檢索到錯(cuò)誤內(nèi)容的攻擊。

舉個(gè)例子來說,如果你運(yùn)行Apache的系統(tǒng)所使用的DNS服務(wù)器發(fā)生了DNS緩存中毒,攻擊者將可能欺騙Apache連接到一個(gè)錯(cuò)誤的服務(wù)器去請(qǐng)求內(nèi)容。另一個(gè)例子是所謂的HTTP請(qǐng)求走私(request-smuggling)攻擊。

這篇文檔并不是深入探討HTTP請(qǐng)求走私的地方(你應(yīng)當(dāng)去問google),但有一點(diǎn)你必須知道:攻擊者可以通過制造一連串的請(qǐng)求并利用原始web服務(wù)器的漏洞,達(dá)到完全控制代理服務(wù)器所檢索到的內(nèi)容的目的。

top

文件句柄緩沖(File-Handle Caching)

打開文件的動(dòng)作本身就是一個(gè)造成延時(shí)的原因,特別是打開網(wǎng)絡(luò)文件系統(tǒng)中的文件。通過維護(hù)一個(gè)保存高使用率文件的文件描述符的緩沖區(qū),Apache就可以避免這種延時(shí)。當(dāng)前,Apache提供了兩種不同的文件句柄緩沖實(shí)現(xiàn)方法。

緩沖文件(CacheFile)

存在于Apache中最基本的緩沖方式是由mod_file_cache實(shí)現(xiàn)的文件句柄(file-handle)緩沖。勝于緩存文件內(nèi)容本身,這個(gè)緩沖區(qū)維護(hù)一張打開的文件描述符表,用于保存在配置文件中使用CacheFile指令指定的文件的文件句柄。

CacheFile指令指示Apache在啟動(dòng)時(shí)打開某個(gè)文件并且為所有之后對(duì)這個(gè)文件的訪問重復(fù)使用這個(gè)文件句柄。

CacheFile /usr/local/apache2/htdocs/index.html

如果你打算使用這種方式緩存大量的文件句柄,你必須確保操作系統(tǒng)對(duì)同時(shí)打開的文件的數(shù)量限制是足夠的。

雖然使用CacheFile不會(huì)導(dǎo)致文件的內(nèi)容被緩存,但是將會(huì)導(dǎo)致在Apache運(yùn)行期間所有對(duì)文件的更改都不會(huì)生效。用于提供服務(wù)的文件的內(nèi)容將從Apache啟動(dòng)以來一直保持不變。

如果在Apache運(yùn)行期間文件被刪除了,Apache將會(huì)持續(xù)維護(hù)一個(gè)打開的文件描述符并且使用Apache啟動(dòng)時(shí)文件的內(nèi)容來提供服務(wù)。這個(gè)通常也意味著雖然文件已經(jīng)被刪除,并且不在文件系統(tǒng)中顯示出來,但是釋放的空間并不會(huì)被覆蓋,直到Apache被停止、文件描述符被關(guān)閉。

CacheEnable fd

mod_mem_cache也提供了一個(gè)文件句柄緩沖方案,可以通過CacheEnable指令來啟用。

CacheEnable fd /

mod_cache的方案相比,這種方案更加智能:緩存內(nèi)容失效以后相應(yīng)的句柄將不再被維護(hù)。

top

內(nèi)存緩沖(In-Memory Caching)

直接從系統(tǒng)的內(nèi)存中提供服務(wù)通常是取得服務(wù)內(nèi)容最快速的方法。從一個(gè)磁盤控制器讀取文件,或者更糟糕的是從遠(yuǎn)程網(wǎng)絡(luò)讀取文件,其速度要慢上幾個(gè)數(shù)量級(jí)。磁盤控制器通常涉及到物理動(dòng)作,訪問網(wǎng)絡(luò)要受限于網(wǎng)絡(luò)帶寬,而訪問內(nèi)存通常僅僅只需要幾毫微秒時(shí)間。

內(nèi)存也許是目前單位字節(jié)最昂貴的存儲(chǔ)器,保證它充分發(fā)揮作用非常重要。將文件緩存在內(nèi)存中將導(dǎo)致系統(tǒng)可用內(nèi)存的減少。正如我們將要看到的,在操作系統(tǒng)存在內(nèi)存緩沖區(qū)的情況下,這不是一個(gè)大問題。但是當(dāng)使用Apache自己的內(nèi)存緩沖區(qū)的情況下,確保沒有為緩沖區(qū)分配太多的內(nèi)存就顯得十分重要。否則,操作系統(tǒng)將會(huì)使用swap(虛擬內(nèi)存/交換區(qū)),這可能會(huì)導(dǎo)致性能急劇下降。

操作系統(tǒng)緩沖

幾乎所有現(xiàn)代的操作系統(tǒng)都由內(nèi)核直接管理文件數(shù)據(jù)在內(nèi)存中的緩沖。這是一個(gè)強(qiáng)有力的特性,并且在極大程度上操作系統(tǒng)做的非常好。比如在Linux系統(tǒng)上,讓我們看看第一次讀取一個(gè)文件和第二次讀取同樣的文件所需要的時(shí)間:

colm@coroebus:~$ time cat testfile > /dev/null
real    0m0.065s
user    0m0.000s
sys     0m0.001s
colm@coroebus:~$ time cat testfile > /dev/null
real    0m0.003s
user    0m0.003s
sys     0m0.000s

即使對(duì)于這樣的一個(gè)小文件,兩次讀取的時(shí)間差異也十分驚人。這是由于內(nèi)核在內(nèi)存中緩存了文件的內(nèi)容。

通過確保在你的系統(tǒng)上始終存在"多余的"內(nèi)存,你就可以確保會(huì)有越來越多的文件內(nèi)容被緩存在這個(gè)緩沖區(qū)中。這是一個(gè)非常有效的內(nèi)存緩沖途徑,并且根本無需對(duì)Apache作出任何額外的配置。

另外,由于操作系統(tǒng)知道文件何時(shí)被修改或刪除了,它就可以自動(dòng)的從內(nèi)存緩沖區(qū)中刪除失效的文件內(nèi)容。這是一個(gè)優(yōu)于Apache自身的內(nèi)存緩沖區(qū)的巨大優(yōu)點(diǎn),因?yàn)锳pache無法得知文件被修改或刪除的信息。

盡管操作系統(tǒng)自動(dòng)管理的緩沖區(qū)有著性能和洞悉文件狀態(tài)的優(yōu)勢(shì),但是在某些情況下Apache自己的內(nèi)存緩沖卻更加有效。

首先,操作系統(tǒng)只能緩存它自己知道的文件,如果你將Apache當(dāng)作一個(gè)代理服務(wù)器運(yùn)行,那么Apache可以緩存非本地文件。如果你還想要無可匹敵的內(nèi)存緩存速度,也必須使用Apache自己的內(nèi)存緩沖區(qū)。

MMapStatic 緩沖

mod_file_cache提供了MMapStatic指令,它可以指示Apache在啟動(dòng)時(shí)將一個(gè)靜態(tài)文件的內(nèi)容映射到內(nèi)存中(使用mmap()系統(tǒng)調(diào)用)。Apache將會(huì)使用內(nèi)存中緩存的內(nèi)容來為后來對(duì)這個(gè)文件的訪問提供內(nèi)容。

MMapStatic /usr/local/apache2/htdocs/index.html

使用了CacheFile指令以后,在Apache運(yùn)行期間,對(duì)這些文件所做的任何修改都不會(huì)生效。

MMapStatic指令并不關(guān)心它占用了多少內(nèi)存,所以你必須確保不要過度濫用這個(gè)指令。每個(gè)Apache子進(jìn)程都將復(fù)制這部分內(nèi)存,所以非常重要的一點(diǎn)是你必須確保被映射的文件不能占用太多的內(nèi)存,以至于操作系統(tǒng)不得不使用交換區(qū)或虛擬內(nèi)存。

mod_mem_cache 緩沖

mod_mem_cache提供了一個(gè)智能的HTTP內(nèi)存緩沖方案。它同時(shí)也直接使用堆內(nèi)存,這也意味著即使MMap不被你的操作系統(tǒng)所支持,mod_mem_cache仍然能夠?qū)崿F(xiàn)緩沖。

這種類型的緩沖可以通過以下方法啟用:

# 啟用內(nèi)存緩沖
CacheEnable mem /

# 將緩沖區(qū)的大小限制為 1 MB
MCacheSize 1024
top

磁盤緩沖(Disk-based Caching)

mod_disk_cachemod_cache提供了一個(gè)基于磁盤的緩沖機(jī)制。和mod_mem_cache一樣,這是一種智能緩沖,僅在緩存內(nèi)容沒有失效的情況下才從緩沖區(qū)中提供服務(wù)。

通常,這個(gè)模塊將按如下方式進(jìn)行配置:

CacheRoot   /var/cache/apache/
CacheEnable disk /
CacheDirLevels 2
CacheDirLength 1

請(qǐng)注意,因?yàn)榫彌_區(qū)位于本地磁盤上,所以操作系統(tǒng)的內(nèi)存緩沖區(qū)通常對(duì)它們的訪問也有效。所以雖然這些文件被存儲(chǔ)在本地磁盤上,但若這些文件被頻繁的訪問,那么很可能操作系統(tǒng)已經(jīng)將它們保存在內(nèi)存中了。

深入理解緩沖存儲(chǔ)區(qū)(Cache-Store)

要將項(xiàng)目保存在緩沖區(qū)中,mod_disk_cache會(huì)為被請(qǐng)求的URL創(chuàng)建一個(gè)22字符的哈希值。該哈希值包含了該URL的主機(jī)名、協(xié)議、端口、路徑、CGI變量,以確保多個(gè)URL不會(huì)發(fā)生碰撞。

這22個(gè)字符的取值范圍是64個(gè)不同的字符,這意味著最多可以有22^64種可能的取值。例如,一個(gè)URL的哈希值可能是:xyTGxSMO2b68mBCykqkp1w 。這個(gè)哈希值將被用作緩存中對(duì)應(yīng)于那個(gè)URL的文件名前綴,但是首先,這個(gè)哈希值將被按照CacheDirLevelsCacheDirLength指令分解成每一級(jí)目錄名。

CacheDirLevels指定了子目錄的層數(shù),CacheDirLength指定了每級(jí)子目錄名的字符數(shù)。使用上述例子的設(shè)置,這個(gè)哈希值將被轉(zhuǎn)化成如下文件名前綴:/var/cache/apache/x/y/TGxSMO2b68mBCykqkp1w

使用這種技術(shù)的總體目標(biāo)是減少某個(gè)特定目錄中子目錄或文件的個(gè)數(shù),因?yàn)榻^大多的文件系統(tǒng)在子目錄或文件數(shù)過多的情況下的訪問速度都會(huì)大打折扣。將CacheDirLength設(shè)置為"1"將使得任意一層目錄下的子目錄數(shù)都不會(huì)超過64,若為設(shè)為"2"則為64*64,依此類推。除非你有一個(gè)非常好的理由,否則"1"將是CacheDirLength指令的推薦值。

如何設(shè)置CacheDirLevels指令的值取決于你預(yù)計(jì)到將會(huì)在緩沖區(qū)中保存多少個(gè)文件。上述示例使用的"2"將會(huì)導(dǎo)致大約會(huì)有4096個(gè)子目錄最終被建立,大約100萬(wàn)個(gè)文件被緩存,大約平均每個(gè)文件夾存儲(chǔ)245個(gè)URL緩沖文件。

每個(gè)URL在緩沖區(qū)中至少會(huì)使用兩個(gè)文件。通常,一個(gè)是包含了URL元信息(meta-information)的".header"文件,比如何時(shí)失效;另一個(gè)是".data"文件,包含了按字節(jié)復(fù)制的用于為URL提供服務(wù)的內(nèi)容。

在通過使用"Vary"頭進(jìn)行內(nèi)容協(xié)商的情況下,將會(huì)為該URL創(chuàng)建一個(gè)".vary"目錄,該目錄下將會(huì)保存多個(gè)適合不同協(xié)商內(nèi)容的".data"文件。

維護(hù)磁盤緩沖區(qū)

雖然mod_disk_cache將會(huì)刪除緩沖區(qū)中失效的文件,但是它并不負(fù)責(zé)維護(hù)整個(gè)緩沖區(qū)總共究竟應(yīng)該占據(jù)多大空間以及至少要保留多少剩余空間。

作為彌補(bǔ),Apache附帶了一個(gè)htcacheclean工具,正如你從它的名字猜到的,它可以周期性的清理緩沖區(qū)。確定htcacheclean的運(yùn)行頻率以及緩沖區(qū)應(yīng)當(dāng)占有多大的磁盤空間是一件復(fù)雜的事情。必須要經(jīng)過多次嘗試和碰壁才能找到一個(gè)最佳值。

htcacheclean有兩種運(yùn)作模型。一種是作為后臺(tái)守護(hù)進(jìn)程運(yùn)行,或者由cron周期性的調(diào)用。htcacheclean經(jīng)常使用一個(gè)小時(shí)或更多的時(shí)間來處理非常巨大的(幾十G)緩沖區(qū),所以如果你是使用cron來調(diào)用它的話,建議你測(cè)試一下多長(zhǎng)時(shí)間運(yùn)行一次比較合適,以避免在同一時(shí)間運(yùn)行多個(gè)實(shí)例。


圖1: 一個(gè)典型的緩沖區(qū)增長(zhǎng)和清理的周期

因?yàn)?code class="module">mod_disk_cache模塊自身并不關(guān)心究竟實(shí)際使用了多少磁盤空間,所以你必須確保htcacheclean被配置為在清理了緩沖區(qū)以后預(yù)留了足夠多的"增長(zhǎng)空間"。