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