<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
HTTP中包體【body】壓縮協商對應的頭欄位為Accept-Encoding/Content-Encoding。對於HTTP包體壓縮,Nginx的ngx_http_gzip_module模組提供了動態gzip壓縮功能,並且有很精細的控制。
包括:
關於Nginx gzip基本功能,其語意,邏輯,設定和使用都相當簡單,網上相關文章也很多,本文不再贅述,具體細節可以參看下文的設定範例及說明。本文將重點討論其中的gzip_proxied指令的語意和使用,其涉及若干個引數,特定的應用場景,最為複雜,且網上文章涉及不多。
gzip_proxied的基本邏輯是對於代理請求,根據請求及迴應的頭欄位決定是否壓縮響應包體。判斷的依據是請求頭中是否攜帶Via頭欄位。
如:
對應的典型網路拓撲如下:
client — proxy1 — proxy2 — … proxyn — reverse proxy — origin web
我們的設定點在reverse proxy上, 也就是企業提供對外WEB服務的邊緣的反向代理伺服器。通常,proxyx會通過Via頭欄位標記訊息自己的版本號和名稱,從而形成了一條有序的訊息路徑,方便排錯。
這是一個取自京東首頁的Via欄位的值,表示博主存取京東首頁中間經過了2臺代理伺服器。
Via: http/1.1 ORI-CLOUD-HEN-MIX-109 (jcs [cSsSfU]), http/1.1 HENzhengzhou-CT-1-MIX-34 (jcs [cRs f ])
我們可以通過在curl中新增頭欄位Via,模擬該場景。
curl -H 'Via: 1.1 aaa' test/200_accept_encoding.css --compressed -I
響應包體是否壓縮,可以curl -I檢視響應頭中是否有Content-Encoding: gzip
如:
HTTP/1.1 200 OK Server: nginx/1.20.1 Date: Fri, 18 Feb 2022 03:25:26 GMT Content-Type: text/css Last-Modified: Tue, 08 Feb 2022 15:48:26 GMT Connection: keep-alive Vary: Accept-Encoding ETag: W/"620290ca-3523" Content-Encoding: gzip
壓縮率可以檢視log
tail -f ../logs/200_accept_encoding_access.log 47151 192.168.31.133 - - [18/Feb/2022:10:08:07 +0800] "GET /200_accept_encoding.css HTTP/1.1" 200 2646 "-" "curl/7.61.1" "-" 5.16
其中5.16就是壓縮率
本文使用的是nginx 1.20.1, 使用者端工具是curl 7.61.1, 測試檔案為200_accept_encoding.css,可自行選擇任意檔案測試。
[root@test01 conf]# nginx -v nginx version: nginx/1.20.1 [root@test01 conf]# curl -V curl 7.61.1 (x86_64-redhat-linux-gnu) libcurl/7.61.1 OpenSSL/1.1.1k zlib/1.2.11 brotli/1.0.6 libidn2/2.2.0 libpsl/0.20.2 (+libidn2/2.2.0) libssh/0.9.4/openssl/zlib nghttp2/1.33.0
#expires 1h; #快取有效期1小時 --->不壓縮 #expires epoch;#快取有效期設為1970年1月1日0時,即必然過期,不快取 --->壓縮
注:響應中需要顯示地攜帶Cache-Control頭欄位,如果不包含則壓縮。
#gzip_proxied no-cache; #gzip_proxied no-store; #gzip_proxied private;
響應中新增Cache-Control頭欄位用add_header指令
#add_header Cache-Control no-store; #add_header Cache-Control no-cache; #add_header Cache-Control private;
可以同時設定多個gzip_proxied條件:
#gzip_proxied no-cache no-store private;
add_header也可以為Cache-Control設定多個值,對於這種有衝突的Cache-Control設定,以最嚴格的限制為準,如本例是no-store生效。
#add_header Cache-Control no-store,no-cache,private;
ETag預設開啟,用etag off可以關閉。
#etag off;
#未找到關閉last_modified的方法,abort。
設定下面2條指令可以模擬基本網頁認證:
#auth_basic "test for auth_basic"; #auth_basic_user_file ../src/usr;
下面是具體的設定,實踐實踐再實踐才是理解和領會相關指令和引數最有效的方法。
組態檔:
log_format gzip '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" $gzip_ratio'; server { listen 80; server_name test test1; root html; access_log logs/200_accept_encoding_access.log gzip; error_log logs/200_accept_encoding_error.log debug; default_type text/plain; #gzip off;#這是設定為off,原因是我在http級別已經把gzip開啟了。 gzip_buffers 16 8k;# gzip_buffers number size; gzip_comp_level 6;#設定壓縮級別,預設為1,可以不用改,級別6大約和gzip命令列預設壓縮率相當。 #gzip_disable "(Chrome|curl|Firefox)";#根據User-Agent的返回值,針對特定使用者端禁止壓縮。這裡把3種使用者端都禁了。 #Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 #curl/7.61.1 #Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0 #gzip_http_version 1.1;#指定gzip壓縮針對的HTTP版本 #gzip_min_length 13603;#設定最小待壓縮的檔案大小,大小的依據是Content-Length,使用的測試檔案為200_accept_encoding.css gzip_min_length 620;#index.html檔案大小正好是620 #gzip *可以表示所有檔案型別 gzip_types application/javascript application/x-javascript text/css *; #mp4有專屬的mime型別,video/mp4,而不是application/octet-stream,可以在conf/mime.types中檢視詳細的mime型別。 #gzip_types application/javascript application/x-javascript text/css application/octet-stream; #gzip_types application/javascript application/x-javascript text/css video/mp4; gzip_vary on;#控制是否插入Vary: Accept-Encoding頭欄位。 #gzip_proxied off;#設定是否壓縮代理請求的迴應,代理請求的依據是請求頭中是否包含Via欄位,off表示只要請求頭中包含Via欄位,則不壓縮。 #gzip_proxied expired;#如果迴應中包含頭欄位Expires,並且其值導致不會快取,則壓縮。 #注1:該設定不考慮是否在請求中包含Via #注2:注1理解是錯誤的,進入gzip_proxied的先決條件一定是頭欄位中包含Via欄位,以當前的設定,在不考慮gzip_proxied影響的情況下,響應一定是壓縮的,所以給人以誤解,當gzip_proxied條件滿足時無論是否有Via都壓縮。 #迴應中新增Expires,注:使用expires指令會同時新增Expires和Cache-Control頭欄位 #expires 1h; #快取有效期1小時 #expires epoch;#快取有效期設為1970年1月1日0時,即必然過期,不快取 #gzip_proxied no-cache no-store private有類似的行為,如果響應頭欄位包含Cache-Control: xxx,則壓縮 #有2點需要注意,1.受Via欄位影響;2.迴應中需要顯示地有Cache-Control頭欄位,如果不包含則壓縮 #gzip_proxied no-cache; #gzip_proxied no-store; #gzip_proxied private; #迴應新增Cache-Control用add_header #add_header Cache-Control no-store; #add_header Cache-Control no-cache; #add_header Cache-Control private; #可以同時設定多個gzip_proxied條件: #gzip_proxied no-cache no-store private; #add_header也可以為Cache-Control設定多個值,對於這種有衝突的Cache-Control設定,以最嚴格的限制為準。 #add_header Cache-Control no-store,no-cache,private; #gzip_proxied no_etag;#如果迴應中不包含頭欄位ETag,則壓縮。 #etag off; #未找到關閉last_modified的方法,abort #gzip_proxied no_last_modified; #if_modified_since off; #gzip_proxied any;#對任意代理請求迴應壓縮。 gzip_proxied auth;#請求中包含Authorization時壓縮 auth_basic "test for auth_basic"; auth_basic_user_file ../src/usr; #curl -H 'Via: 1.1 aaa' test --compressed --basic -u root:root #curl可以使用2種命令列方式驗證gzip,一種是新增Accept-Encoding頭欄位,一種使用compressed引數 #curl -H 'Accept-Encoding: gzip' test/200_accept_encoding.css --output a.css #curl test/200_accept_encoding.css --compressed #如果使用者端請求不支援的壓縮方式如br,則伺服器將忽略之 location / { #return 200 'okn';#如果使用return,則在gzip模組生效之前就退出,所以不會壓縮。 #Content-Length和Cotnent-Encoding不會同時出現,因為gzip是實時動態壓縮,無法預先取得Content-Length。 #Accept-Encoding實驗中curl必須顯示的新增Accept-Encoding頭欄位,否則視為不使用壓縮方式返回響應,而瀏覽器天然會新增Accept-Encoding #$gzip_ratio計算的是原始檔和壓縮檔案的大小之比,如原始檔100,壓縮檔案20,則ratio為5 } }
到此這篇關於一篇文章讀懂nginx中gzip功能的文章就介紹到這了,更多相關nginx gzip功能內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45