Apache HTTP Server 版本2.2
說明 | 壓縮發(fā)送給客戶端的內(nèi)容 |
---|---|
狀態(tài) | 擴展(E) |
模塊名 | deflate_module |
源文件 | mod_deflate.c |
mod_deflate
模塊提供了DEFLATE
輸出過濾器,允許服務器在將輸出內(nèi)容發(fā)送到客戶端以前進行壓縮,以節(jié)約帶寬。
這是一個針對心急者的示范配置:
AddOutputFilterByType DEFLATE text/html text/plain text/xml
以下允許壓縮更多內(nèi)容的配置更加復雜。除非你明白所有的配置細節(jié),否則請不要使用。
<Location />
# 插入過濾器
SetOutputFilter DEFLATE
# Netscape 4.x 有一些問題...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 有更多的問題
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE 會偽裝成 Netscape ,但是事實上它沒有問題
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# 不壓縮圖片
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
# 確保代理不會發(fā)送錯誤的內(nèi)容
Header append Vary User-Agent env=!dont-vary
</Location>
壓縮是由DEFLATE
過濾器實現(xiàn)的。下面的指令會對其所在容器中的文檔啟用壓縮:
SetOutputFilter DEFLATE
一些流行的瀏覽器不能正確處理所有壓縮內(nèi)容,因此你可能需要將gzip-only-text/html
標記設為"1
"來僅僅允許壓縮html文件(見下面)。如果你設置了"1
"以外的任何值,都將被忽略。
如果你想將壓縮限制在幾種特定的MIME類型上,可以使用AddOutputFilterByType
指令。下面的例子僅僅允許對html文檔進行壓縮:
<Directory "/your-server-root/manual">
AddOutputFilterByType DEFLATE text/html
</Directory>
對于那些不能正確處理所有壓縮內(nèi)容的瀏覽器,可以使用BrowserMatch
指令針對特定的瀏覽器設置no-gzip
標記以取消壓縮。為了取得更好的效果,你可以將no-gzip
和gzip-only-text/html
配合使用。在這種情況下,下面的設置將會覆蓋上面的設置?纯磸配置示例中摘錄的片斷:
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
第一條指令表示如果User-Agent
字符串表示它是一個Navigator 4.x的瀏覽器,這種瀏覽器不能正確處理除text/html
之外的所有類型。而4.06, 4.07, 4.08版的Navigator完全不能處理任何壓縮內(nèi)容,因此第二條指令對這些瀏覽器完全禁用壓縮。
第三個BrowserMatch
指令修正了上面兩條對瀏覽器的推測,因為微軟的IE也將它自己標識成"Mozilla/4"但是它實際上能夠處理所有的壓縮內(nèi)容。因此又在User-Agent
頭中額外匹配了字符串"MSIE"("\b
"表示"單詞邊界"),并且取消了前面的限制。
DEFLATE
過濾器總是在類似于PHP或SSI之類的資源過濾器之后插入,它永遠不會觸及到內(nèi)部請求。mod_deflate
模塊還提供了一個解壓gzip格式的應答體的功能。為了激活這個特性你必須使用SetOutputFilter
或AddOutputFilter
指令將INFLATE
過濾器插入到輸入過濾器鏈:
<Location /dav-area>
ProxyPass http://example.com/
SetOutputFilter INFLATE
</Location>
這個例子將會解壓來自example.com的輸出,這樣其它過濾器就可以做進一步的處理了。
mod_deflate
模塊還提供了一個解壓gzip格式的請求體的功能。為了激活這個特性你必須使用SetInputFilter
或AddInputFilter
指令將DEFLATE
過濾器插入到輸入過濾器鏈。例如:
<Location /dav-area>
SetInputFilter DEFLATE
</Location>
這樣,如果包含"Content-Encoding: gzip
"頭的請求體將會被自動解壓。極少有瀏覽器壓縮請求體。然而有些程序的確這么做了,比如一些WebDAV客戶端程序。
如果你自己處理請求體,請注意Content-Length
頭僅僅表示客戶端輸入的數(shù)據(jù)長度,而不是解壓后的實際數(shù)據(jù)長度。
mod_deflate
模塊發(fā)送一個"Vary: Accept-Encoding
"HTTP應答頭以提醒代理服務器:只對發(fā)送了正確"Accept-Encoding
"頭的客戶端發(fā)送緩存的應答。這樣可以防止不能正確處理壓縮內(nèi)容的瀏覽器接受到經(jīng)過壓縮的內(nèi)容。
如果你按照某些特殊的條件拒絕了某些客戶端的訪問(比如User-Agent
頭),你必須手動配置一個額外的Vary
頭提醒代理服務器做額外的限制。比如,在一個典型的配置中的某處,如果額外的DEFLATE
過濾器是否生效取決于User-Agent
頭,你應當在此處添加:
Header append Vary User-Agent
如果依照除請求頭以外的其他條件決定是否使用壓縮(例如:HTTP版本),你必須設置Vary
頭的值為"*
"來完全阻止代理服務器的緩存。
Header set Vary *
說明 | 用于zlib一次壓縮的片斷大小(字節(jié)) |
---|---|
語法 | DeflateBufferSize value |
默認值 | DeflateBufferSize 8096 |
作用域 | server config, virtual host |
狀態(tài) | 擴展(E) |
模塊 | mod_deflate |
DeflateBufferSize
指令定義了zlib一次壓縮的片斷的字節(jié)數(shù)。
說明 | 將輸出內(nèi)容壓縮的程度 |
---|---|
語法 | DeflateCompressionLevel value |
默認值 | Zlib的默認值 |
作用域 | server config, virtual host |
狀態(tài) | 擴展(E) |
模塊 | mod_deflate |
兼容性 | 僅在 Apache 2.0.45 及以后的版本中可用 |
DeflateCompressionLevel
指令設置壓縮程度,越高的壓縮程度就會有越好的壓縮效果,同時也意味著占用越多的CPU資源。
取值范圍在 1(最低壓縮率) 到 9(最高壓縮率)之間。
說明 | 在日志中放置壓縮率標記 |
---|---|
語法 | DeflateFilterNote [type] notename |
作用域 | server config, virtual host |
狀態(tài) | 擴展(E) |
模塊 | mod_deflate |
兼容性 | type僅在2.0.45以后版本中可用 |
DeflateFilterNote
指令指定將一個指示壓縮率的標記附加在請求之后。notename就表示這個標記的名字。你可以為了某種統(tǒng)計目的將這個標記的名字添加到訪問日志中。
DeflateFilterNote ratio
LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate
CustomLog logs/deflate_log deflate
如果你想從日志中得到更多精確的數(shù)據(jù),可以使用type參數(shù)指定notename標記所記錄的數(shù)據(jù)類型。type的取值范圍如下:
Input
Output
Ratio
輸出/輸入*100
)。這是type的默認值。于是,就可以這樣記錄:
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
CustomLog logs/deflate_log deflate