歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> 【nginx】關於gzip壓縮

【nginx】關於gzip壓縮

日期:2017/3/1 12:20:53   编辑:關於Linux
有這麼一段配置文件 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


Copyright © Linux教程網 All Rights Reserved