有這麼一段配置文件
gzip on
# 默認值: gzip off
# 開啟或者關閉gzip模塊
gzip_static off;
# nginx對於靜態文件的處理模塊
# 該模塊可以讀取預先壓縮的gz文件,這樣可以減少每次請求進行gzip壓縮的CPU資源消耗。該模塊啟用後,nginx首先檢查是否存在請求靜態文件的gz結尾的文件,如果有則直接返回該gz文件內容。為了要兼容不支持gzip的浏覽器,啟用gzip_static模塊就必須同時保留原始靜態文件和gz文件。這樣的話,在有大量靜態文件的情況下,將會大大增加磁盤空間。我們可以利用nginx的反向代理功能實現只保留gz文件。
# 可以google"nginx gzip_static"了解更多
gzip_comp_level 4;
# 默認值:1(建議選擇為4)
# gzip壓縮比/壓縮級別,壓縮級別 1-9,級別越高壓縮率越大,當然壓縮時間也就越長(傳輸快但比較消耗cpu)。
gzip_buffers 4 16k;
# 默認值: gzip_buffers 4 4k/8k
# 設置系統獲取幾個單位的緩存用於存儲gzip的壓縮結果數據流。 例如 4 4k 代表以4k為單位,按照原始數據大小以4k為單位的4倍申請內存。 4 8k 代表以8k為單位,按照原始數據大小以8k為單位的4倍申請內存。
# 如果沒有設置,默認值是申請跟原始數據相同大小的內存空間去存儲gzip壓縮結果。
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
#gzip_types mime-type [mime-type ...];
# 默認值: gzip_types text/html (默認不對js/css文件進行壓縮)
# 壓縮類型,匹配MIME類型進行壓縮
# 不能用通配符 text/*
# (無論是否指定)text/html默認已經壓縮
# 設置哪壓縮種文本文件可參考 conf/mime.types
gzip_min_length 1k;
# 默認值: 0 ,不管頁面多大都壓縮
# 設置允許壓縮的頁面最小字節數,頁面字節數從header頭中的Content-Length中進行獲取。
# 建議設置成大於1k的字節數,小於1k可能會越壓越大。 即: gzip_min_length 1024
gzip_http_version 1.0
# 默認值: gzip_http_version 1.1(就是說對HTTP/1.1協議的請求才會進行gzip壓縮)
# 識別http的協議版本。由於早期的一些浏覽器或者http客戶端,可能不支持gzip自解壓,用戶就會看到亂碼,所以做一些判斷還是有必要的。
# 注:99.99%的浏覽器基本上都支持gzip解壓了,所以可以不用設這個值,保持系統默認即可。
# 假設我們使用的是默認值1.1,如果我們使用了proxy_pass進行反向代理,那麼nginx和後端的upstream server之間是用HTTP/1.0協議通信的,如果我們使用nginx通過反向代理做Cache Server,而且前端的nginx沒有開啟gzip,同時,我們後端的nginx上沒有設置gzip_http_version為1.0,那麼Cache的url將不會進行gzip壓縮
gzip_proxied any
#gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any] ...;
# 默認值:off
# Nginx作為反向代理的時候啟用,開啟或者關閉後端服務器返回的結果,匹配的前提是後端服務器必須要返回包含"Via"的 header頭。
# off - 關閉所有的代理結果數據的壓縮
# expired - 啟用壓縮,如果header頭中包含 "Expires" 頭信息
# no-cache - 啟用壓縮,如果header頭中包含 "Cache-Control:no-cache" 頭信息
# no-store - 啟用壓縮,如果header頭中包含 "Cache-Control:no-store" 頭信息
# private - 啟用壓縮,如果header頭中包含 "Cache-Control:private" 頭信息
# no_last_modified - 啟用壓縮,如果header頭中不包含 "Last-Modified" 頭信息
# no_etag - 啟用壓縮 ,如果header頭中不包含 "ETag" 頭信息
# auth - 啟用壓縮 , 如果header頭中包含 "Authorization" 頭信息
# any - 無條件啟用壓縮
gzip_vary on;
# 和http頭有關系,加個vary頭,給代理服務器用的,有的浏覽器支持壓縮,有的不支持,所以避免浪費不支持的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮
gzip_disable "MSIE [1-6].";
# 禁用IE6的gzip壓縮,又是因為杯具的IE6。當然,IE6目前依然廣泛的存在,所以這裡你也可以設置為“MSIE [1-5].”
# IE6的某些版本對gzip的壓縮支持很不好,會造成頁面的假死,為了確保其它的IE6版本不出問題,所以建議加上gzip_disable的設置
1、gzip_comp_level
text/html - phpinfo():
0 55.38 KiB (100.00% of original size)
1 11.22 KiB ( 20.26% of original size)
2 10.89 KiB ( 19.66% of original size)
3 10.60 KiB ( 19.14% of original size)
4 10.17 KiB ( 18.36% of original size)
5 9.79 KiB ( 17.68% of original size)
6 9.62 KiB ( 17.37% of original size)
7 9.50 KiB ( 17.15% of original size)
8 9.45 KiB ( 17.06% of original size)
9 9.44 KiB ( 17.05% of original size)
application/x-javascript - jQuery 1.8.3 (Uncompressed):
0 261.46 KiB (100.00% of original size)
1 95.01 KiB ( 36.34% of original size)
2 90.60 KiB ( 34.65% of original size)
3 87.16 KiB ( 33.36% of original size)
4 81.89 KiB ( 31.32% of original size)
5 79.33 KiB ( 30.34% of original size)
6 78.04 KiB ( 29.85% of original size)
7 77.85 KiB ( 29.78% of original size)
8 77.74 KiB ( 29.73% of original size)
9 77.75 KiB ( 29.74% of original size)
這裡沒有考慮CPU使用率,理想的壓縮級別在4-6之間
2、gzip_static
該模塊可以讀取預先壓縮的gz文件,這樣可以減少每次請求進行gzip壓縮的CPU資源消耗。該模塊啟用後,nginx首先檢查是否存在請求靜態文件的gz結尾的文件,如果有則直接返回該gz文件內容。為了要兼容不支持gzip的浏覽器,啟用gzip_static模塊就必須同時保留原始靜態文件和gz文件。這樣的話,在有大量靜態文件的情況下,將會大大增加磁盤空間。我們可以利用nginx的反向代理功能實現只保留gz文件。
# 可以google"nginx gzip_static"了解更多
使用PHP預先壓縮如下
function gzip_static($path)
{
if ((extension_loaded('zlib') === true) && (is_file($path) === true))
{
$levels = array();
$content = file_get_contents($path);
foreach (range(1, 9) as $level)
{
$levels[$level] = strlen(gzencode($content, $level));
}
if ((count($levels = array_filter($levels)) > 0) && (min($levels) < strlen($content)))
{
if (file_put_contents($path . '.gz', gzencode($content, array_search(min($levels), $levels)), LOCK_EX) !== false)
{
return touch($path . '.gz', filemtime($path), fileatime($path));
}
}
}
return false;
}
3、開啟緩存
location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)(\?[0-9]+)?$ {
valid_referers none blocked www.xx.com xx.com
expires 30d;
log_not_found off;
access_log off;
}
location ~* \.(js|css)$ {
expires 7d;
log_not_found off;
access_log off;
}
location = /(favicon.ico|roboots.txt) {
access_log off;
log_not_found off;
}
location ~* \.(htacess|svn|tar.gz|tar|zip|sql) {
return 404;
}
location ~* \.(eot|ttf|otf|woff|svg)$ {
access_log off;
expires max;
}
4、gzip_vary
要了解 Vary 的作用,先得了解 HTTP 的內容協商機制。有時候,同一個 URL 可以提供多份不同的文檔,這就要求服務端和客戶端之間有一個選擇最合適版本的機制,這就是內容協商
vary機制是http1.1 協議的新特性,使得server端可以根據用戶請求返回給用戶不同的內容,現在互聯網中應用vary最廣的一點就是對壓縮的支持,例如當用戶請求帶著header “Accept-Encoding: gzip,deflate”,表明用戶期望從server端拿到壓縮的內容,這樣server端會給用戶一個包含壓縮內容的文件,並帶著vary頭“vary: Accept-Encoding”頭,和“Content-Encoding:gzip ”頭,如果用戶請求非壓縮的內容,源站也就可以給用戶非壓縮的內容。
這個出問題很多時候在於緩存服務的時候,比如squid
這個啟用之後,response header 中會加上 Vary: Accept-Encoding
gzip_vary on;
用 curl 驗證
[root@AY ~]# curl -I -v http://common.cnblogs.com/script/jquery.js
* About to connect() to common.cnblogs.com port 80 (#0)
* Trying 42.121.254.191... connected
* Connected to common.cnblogs.com (42.121.254.191) port 80 (#0)
> HEAD /script/jquery.js HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: common.cnblogs.com
> Accept: */*
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Date: Sun, 22 Nov 2015 11:21:55 GMT
Date: Sun, 22 Nov 2015 11:21:55 GMT
< Content-Type: application/javascript
Content-Type: application/javascript
< Content-Length: 94020
Content-Length: 94020
< Connection: keep-alive
Connection: keep-alive
< Vary: Accept-Encoding
Vary: Accept-Encoding
< Cache-Control: public,max-age=25920000
Cache-Control: public,max-age=25920000
< Last-Modified: Fri, 15 Feb 2013 03:06:57 GMT
Last-Modified: Fri, 15 Feb 2013 03:06:57 GMT
< Accept-Ranges: bytes
Accept-Ranges: bytes
< ETag: "7468b58329bce1:0"
ETag: "7468b58329bce1:0"
<
* Connection #0 to host common.cnblogs.com left intact
* Closing connection #0