nginx系列(十七)nginx下的gzip与vary、预压缩、缓存、反向代理的结合
前言?
在http的協議里,為了減少網絡傳輸,允許將報文進行gzip壓縮以后再傳輸。雖然網絡傳輸體積減小了,但是服務器壓縮和瀏覽器的解壓縮消耗了CPU的計算。?
后來出現了預壓縮技術,就是提前把靜態文件進行gzip壓縮,當請求來的時候,直接讀走。這樣服務器就沒了壓縮消耗,而瀏覽器的解壓縮性能相比網絡IO,影響不大。?
一 動態nginx的gzip?
每次請求來的時候,要實時進行壓縮。但是有個問題,就是壓縮過的文件,要重復壓縮,這樣后面的靜態壓縮就派上用場了。?
1.靜態文件壓縮?
每次請求靜態文件的時候,都會動態壓縮靜態文件。?
2.反向代理壓縮?
反向代理返回的報文,也是可以壓縮的。但也是每次動態壓縮。可以根據頭信息處理?
3.代理緩存壓縮,瀏覽器緩存?
在做反向代理的時候,可以緩存應用服務器返回的報文,支持緩存首部Cache-Control等。緩存的文件為明文。但是反向代理和壓縮緩存,可以分層來解決。反向代理服務器動態壓縮,而CDN直接緩存結果(壓縮與非壓縮)。相當于加了2層代理來處理。?
對于瀏覽器,開啟Expire首部,則瀏覽器可以緩存壓縮后的結果,減少服務器請求。?
4.代理的vary首部壓縮?
其實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?
?
原始文件:284k?
代碼混淆,代碼壓縮:95k?
gzip壓縮:33k?
可以看到,284k的jquery文件,經過處理以后,變成了33k。?
nginx配置文件?
http節點下配置:?
gzip? on;?
location節點下配置?
gzip_vary on;?
gzip_static on;?
壓縮有瀏覽器查看?
?
完整配置文件請參考附件?
三 常用命令和技巧?
以下三條命令,都可以附加上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?
四 參數含義?
Python代碼?
# 開啟壓縮 gzip on; # 設置允許壓縮的頁面最小字節數,頁面字節數從header頭得content-length中進行獲取。默認值是0,不管頁面多大都壓縮。建議設置成大于2k的字節數,小于2k可能會越壓越大。 gzip_min_length 2k; # 設置系統獲取幾個單位的緩存用于存儲gzip的壓縮結果數據流。 例如 4 4k 代表以4k為單位,按照原始數據大小以4k為單位的4倍申請內存。 4 8k 代表以8k為單位,按照原始數據大小以8k為單位的4倍申請內存。 # 如果沒有設置,默認值是申請跟原始數據相同大小的內存空間去存儲gzip壓縮結果。 gzip_buffers 4 16k; #壓縮級別,1-10,數字越大壓縮的越好,也越占用CPU時間 gzip_comp_level 5; # 默認值: gzip_types text/html (默認不對js/css文件進行壓縮) # 壓縮類型,匹配MIME類型進行壓縮 # 不能用通配符 text/* # (無論是否指定)text/html默認已經壓縮 # 設置哪壓縮種文本文件可參考 conf/mime.types gzip_types text/plain application/x-javascript text/css application/xml; # 值為1.0和1.1 代表是否壓縮http協議1.0,選擇1.0則1.0和1.1都可以壓縮 gzip_http_version 1.0 # IE6及以下禁止壓縮 gzip_disable "MSIE [1-6]\."; # 默認值: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_proxied expired no-cache no-store private auth; # 給CDN和代理服務器使用,針對相同url,可以根據頭信息返回壓縮和非壓縮副本 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
總結
以上是生活随笔為你收集整理的nginx系列(十七)nginx下的gzip与vary、预压缩、缓存、反向代理的结合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Teams架构剖析(2019年版本)
- 下一篇: 米字格图片可打印_练字本米字格模板可打印