如何在 apache 中開啟 gzip 壓縮服務
伺服器設定 gzip 壓縮是 web 開發裡很普遍的做法。假設你要請求一個 100k 的檔案,網路傳輸速度為 50k/s,需要 2s 才能得到資料,但是如果在伺服器設定了 gzip 壓縮,將服務端的檔案壓縮到了 50k(實際上的壓縮率往往小於 50%),這時候只需 1s 就能得到資料,然後在客戶端解壓即可。
可以對比下同一個檔案在開啟 gzip 前後的大小。
gzip 壓縮前:
gzip 壓縮後:
那麼如何在服務端開啟 gzip 服務呢?這裡以 apache 為例簡單介紹下。
開啟 apache 的 "httpd.conf" 檔案,比如我的是在 "C:\wamp\bin\apache\Apache2.2.21\conf" 目錄下。找到以下這一行,將它前面的註釋(#)去掉:
複製程式碼LoadModule deflate_module modules/mod_deflate.so
很多參考檔案都提到同時要對 LoadModule headers_module modules/mod_headers.so
去掉註釋,說 "如果不開啟這個,那網站就不能正常顯示了" ,不過我在測試過程中沒有去掉也沒有問題。
接著再添上以下程式碼:
複製程式碼<IfModule mod_deflate.c>
# 告訴 apache 對傳輸到瀏覽器的內容進行壓縮
SetOutputFilter DEFLATE
# 壓縮等級 9
DeflateCompressionLevel 9
</IfModule>
這樣就能對所有檔案進行 gzip 壓縮了。壓縮等級是個 1-9 之間的整數,取值範圍在 1(最低) 到 9(最高)之間,不建議設定太高,雖然有很高的壓縮率,但是佔用更多的CPU資源。(本地測試了下 1 和 9 壓縮率差不了多少...)
實際開發中我們並不需要對所有檔案進行壓縮,比如我們無需對圖片檔案進行 gzip 壓縮,因為圖片檔案(一般為 jpg、png等格式)本身已經壓縮過了,再進行 gzip 壓縮可能會適得其反(詳見 圖片要啟用gzip壓縮嗎?絕對不要!,背景圖片千萬不要gzip壓縮,尤其是PNG),類似的還有 PDF 以及音樂檔案。所以我們可以設定過濾指定檔案或者對指定檔案進行壓縮。
比如我們要對圖片等特殊檔案不進行 gzip 壓縮處理:
複製程式碼<IfModule mod_deflate.c>
# 告訴 apache 對傳輸到瀏覽器的內容進行壓縮
SetOutputFilter DEFLATE
# 壓縮等級 9
DeflateCompressionLevel 9
#設定不對字尾gif,jpg,jpeg,png的圖片檔案進行壓縮
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
</IfModule>
或者指定檔案格式進行壓縮:
複製程式碼<IfModule mod_deflate.c>
# 壓縮等級 9
DeflateCompressionLevel 9
# 壓縮型別 html、xml、php、css、js
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript application/x-httpd-php
AddOutputFilter DEFLATE js css
</IfModule>
修改好後,儲存 httpd.conf 檔案,記得重啟 apache,再重新整理瀏覽器看請求,應該已經生效了!