nginx學習--nginx下的gzip與vary、預壓縮、緩存、反向代理的結合

來自:nginx系列(十七)nginx下的gzip與vary、預壓縮、緩存、反向代理的結合

介紹

在http的協議裏,爲了減小網絡傳輸,容許將報文進行gzip壓縮之後再傳輸。雖然網絡傳輸體積減少了,可是服務器壓縮和瀏覽器的解壓縮消耗了CPU的計算。javascript

後來出現了預壓縮技術,就是提早把靜態文件進行gzip壓縮,當請求來的時候,直接讀走。這樣服務器就沒了壓縮消耗,而瀏覽器的解壓縮性能相比網絡IO,影響不大。css

一 動態nginx的gzip

每次請求來的時候,要實時進行壓縮。可是有個問題,就是壓縮過的文件,要重複壓縮,這樣後面的靜態壓縮就派上用場了。html

  • 1.靜態文件壓縮前端

    每次請求靜態文件的時候,都會動態壓縮靜態文件。java

  • 2.反向代理壓縮jquery

    反向代理返回的報文,也是能夠壓縮的。但也是每次動態壓縮。能夠根據頭信息處理linux

  • 3.代理緩存壓縮,瀏覽器緩存nginx

    在作反向代理的時候,能夠緩存應用服務器返回的報文,支持緩存首部Cache-Control等。緩存的文件爲明文。可是反向代理和壓縮緩存,能夠分層來解決。反向代理服務器動態壓縮,而CDN直接緩存結果(壓縮與非壓縮)。至關於加了2層代理來處理。 對於瀏覽器,開啓Expire首部,則瀏覽器能夠緩存壓縮後的結果,減小服務器請求。web

  • 4.代理的vary首部壓縮apache

    其實cdn,代理服務器,原理上都是代理服務器。他們通常以url爲key值進行緩存。而vary屬性的設置,告訴了代理根據url緩存的同時,vary的信息也做爲key。好比客戶端(瀏覽器)請求的信息裏帶上了Accept-Encoding:gzip 則返回壓縮副本。若是沒有帶這個頭信息,默認返回非壓縮副本。

二 靜態nginx的gzip:預壓縮

對於靜態文件先壓縮再輸出是再正常不過的事了,可是這種壓縮都是動態的,在每次請求都會先壓縮再輸出,大大浪費了不少cpu。若是前端加了反向代理緩存,那能減小這種浪費。但不是每一個生產環境前端都有緩存的。而nginx有個模塊Gzip Precompression,這個模塊的做用是對於須要壓縮的文件,直接讀取已經壓縮好的文件(文件名爲加.gz),而不是動態壓縮,對於不支持gzip的請求則讀取原文件。 ./configure --prefix=/opt/nginx/nginx-1.9.6 --with-http_gzip_static_module

  • 1.gzip_static配置優先級高於gzip
  • 2.開啓nginx_static後,對於任何文件都會先查找是否有對應的gz文件
  • 3.gzip_types設置對gzip_static無效

壓縮測試

驗證方法也很簡單。能夠自行壓縮不一樣大小的×.gz文件,經過瀏覽器調試工具查看返回的文件大小便可。 壓縮命令 gzip -c -9 jquery-1.11.2.min.js > jquery-1.11.2.min.js.gz img 原始文件:284k 代碼混淆,代碼壓縮:95k gzip壓縮:33k 能夠看到,284k的jquery文件,通過處理之後,變成了33k。

nginx配置文件

  • http節點下配置: gzip on;
  • location節點下配置 gzip_vary on; gzip_static on;

壓縮有瀏覽器查看 img

完整配置文件請參考附件

三 經常使用命令和技巧

如下三條命令,均可以附加上Accept-Encoding首部,來獲取壓縮與非壓縮的服務器報文

apache-bench 
./ab -n 100000 -c 16 -H 'Accept-Encoding: gzip' 'http://192.168.56.2:8080/cache_ehcache-2.10.0_web/ex^Cre' 

wget 
其中wget是以http/1.0請求的,這個要注意gizp裏開啓1.0的壓縮,默認是不開啓的 
wget --header=Accept-Encoding:gzip --save-headers  -d http://192.168.56.2:8080/cache_ehcache-2.10.0_web/expire 

curl 
curl -v -H "Accept-Encoding:gzip" http://192.168.56.2:8080/cache_ehcache-2.10.0_web/expire

四 參數含義

  1. # 開啓壓縮
  2. gzip on;
  3. # 設置容許壓縮的頁面最小字節數,頁面字節數從header頭得content-length中進行獲取。默認值是0,無論頁面多大都壓縮。建議設置成大於2k的字節數,小於2k可能會越壓越大。
  4. gzip_min_length 2k;
  5. # 設置系統獲取幾個單位的緩存用於存儲gzip的壓縮結果數據流。 例如 4 4k 表明以4k爲單位,按照原始數據大小以4k爲單位的4倍申請內存。 4 8k 表明以8k爲單位,按照原始數據大小以8k爲單位的4倍申請內存。
  6. # 若是沒有設置,默認值是申請跟原始數據相同大小的內存空間去存儲gzip壓縮結果。
  7. gzip_buffers 4 16k;
  8. #壓縮級別,1-10,數字越大壓縮的越好,也越佔用CPU時間
  9. gzip_comp_level 5;
  10. # 默認值: gzip_types text/html (默認不對js/css文件進行壓縮)
  11. # 壓縮類型,匹配MIME類型進行壓縮
  12. # 不能用通配符 text/*
  13. # (不管是否指定)text/html默認已經壓縮
  14. # 設置哪壓縮種文本文件可參考 conf/mime.types
  15. gzip_types text/plain application/x-javascript text/css application/xml;
  16. # 值爲1.0和1.1 表明是否壓縮http協議1.0,選擇1.0則1.0和1.1均可以壓縮
  17. gzip_http_version 1.0
  18. # IE6及如下禁止壓縮
  19. gzip_disable "MSIE [1-6].";
  20. # 默認值:off
  21. # Nginx做爲反向代理的時候啓用,開啓或者關閉後端服務器返回的結果,匹配的前提是後端服務器必需要返回包含"Via"的 header頭。
  22. # off - 關閉全部的代理結果數據的壓縮
  23. # expired - 啓用壓縮,若是header頭中包含 "Expires" 頭信息
  24. # no-cache - 啓用壓縮,若是header頭中包含 "Cache-Control:no-cache" 頭信息
  25. # no-store - 啓用壓縮,若是header頭中包含 "Cache-Control:no-store" 頭信息
  26. # private - 啓用壓縮,若是header頭中包含 "Cache-Control:private" 頭信息
  27. # no_last_modified - 啓用壓縮,若是header頭中不包含 "Last-Modified" 頭信息
  28. # no_etag - 啓用壓縮 ,若是header頭中不包含 "ETag" 頭信息
  29. # auth - 啓用壓縮 , 若是header頭中包含 "Authorization" 頭信息
  30. # any - 無條件啓用壓縮
  31. gzip_proxied expired no-cache no-store private auth;
  32. # 給CDN和代理服務器使用,針對相同url,能夠根據頭信息返回壓縮和非壓縮副本
  33. gzip_vary on;

五 參考資料

nginx 預壓縮(gzip)靜態文件 http://willko.iteye.com/blog/667091

Nginx中gzip_static模塊的使用 http://inosin.iteye.com/blog/1299705

Nginx 開啓Gzip壓縮的方法(很是的詳解) http://www.111cn.net/sys/nginx/69492.htm

Nginx Gzip模塊啓用和配置指令詳解 http://www.jb51.net/article/48995.htm

linux下gzip的壓縮詳解 http://booby325.iteye.com/blog/1685855

加速nginx: 開啓gzip和緩存 http://www.darrenfang.com/2015/01/setting-up-http-cache-and-gzip-with-nginx/

配置vary http://www.webkaka.com/blog/archives/how-to-set-Vary-Accept-Encoding-header.html

相關文章
相關標籤/搜索