欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一篇文章讀懂nginx的gzip功能

 更新時間:2022年05月12日 15:15:41   作者:乘風破浪2021  
nginx提供了對文件內容壓縮的功能,允許將內容在發(fā)送到客戶端之前根據(jù)具體的策略進行壓縮從而節(jié)約帶寬,下面這篇文章主要給大家介紹了如何通過一篇文章讀懂nginx的gzip功能,需要的朋友可以參考下

前言

HTTP中包體【body】壓縮協(xié)商對應的頭字段為Accept-Encoding/Content-Encoding。對于HTTP包體壓縮,Nginx的ngx_http_gzip_module模塊提供了動態(tài)gzip壓縮功能,并且有很精細的控制。

包括:

  • 開啟關閉gzip壓縮: gzip on|off
  • 對指定類型的文件進行壓縮: gzip_types
  • 文件最小壓縮閾值: gzip_min_length
  • 設置壓縮率: gzip_comp_level
  • 查看壓縮率: $gzip_ratio
  • 是否插入Vary: Accept-Encoding頭字段: gzip_vary
  • 禁止指定瀏覽器使用壓縮:gzip_disable
  • 是否對代理請求響應壓縮:gzip_proxied

關于Nginx gzip基本功能,其語義,邏輯,配置和使用都相當簡單,網(wǎng)上相關文章也很多,本文不再贅述,具體細節(jié)可以參看下文的配置實例及說明。本文將重點討論其中的gzip_proxied指令的語義和使用,其涉及若干個參數(shù),特定的應用場景,最為復雜,且網(wǎng)上文章涉及不多。

語義:

gzip_proxied的基本邏輯是對于代理請求,根據(jù)請求及回應的頭字段決定是否壓縮響應包體。判斷的依據(jù)是請求頭中是否攜帶Via頭字段。

如:

拓撲:

對應的典型網(wǎng)絡拓撲如下:

client — proxy1 — proxy2 — … proxyn — reverse proxy — origin web

我們的配置點在reverse proxy上, 也就是企業(yè)提供對外WEB服務的邊緣的反向代理服務器。通常,proxyx會通過Via頭字段標記消息自己的版本號和名稱,從而形成了一條有序的消息路徑,方便排錯。

這是一個取自京東首頁的Via字段的值,表示博主訪問京東首頁中間經(jīng)過了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

gzip_proxied的參數(shù)解析:

  • off gzip_proxied的缺省參數(shù)是off,語義是不對代理請求的回應進行壓縮。
  • any 對任意代理請求回應壓縮,語義正好和off相反。
  • expired 如果回應中包含頭字段Expires,并且其值響應導致不會緩存,則壓縮。因此可以構造緩存不過期,緩存過期2種場景,分別驗證?;貞刑砑覧xpires頭字段可以用expires指令。
#expires 1h; #緩存有效期1小時 --->不壓縮
#expires epoch;#緩存有效期設為1970年1月1日0時,即必然過期,不緩存 --->壓縮
  • no-cache no-store private 此3個參數(shù)有類似的行為和語義,放在一起說,語義是如果響應頭字段包含Cache-Control: xxx,xxx是上述參數(shù)中的一個,則壓縮。

注:響應中需要顯示地攜帶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;
  • no_etag 語義是如果回應中不包含頭字段ETag,則壓縮。

ETag默認打開,用etag off可以關閉。

#etag off;
  • no_last_modified 語義是如果回應中不包含頭字段Last_modified,則壓縮。

#未找到關閉last_modified的方法,abort。

  • auth 語義是請求中包含Authorization時壓縮

配置下面2條指令可以仿真基本網(wǎng)頁認證:

#auth_basic "test for auth_basic";
#auth_basic_user_file ../src/usr;

小結:

  1. gzip_min_length的優(yōu)先級高于gzip_proxied,如果由于gzip_min_length的設置導致不壓縮,則gzip_proxied即使?jié)M足壓縮條件也不會壓縮。
  2. 上述gzip_proxied的參數(shù),除auth是看請求頭字段,其它都是看響應頭字段。
  3. off, any是一對互斥參數(shù),表達了對代理請求是全部不壓縮,或全部壓縮兩種相反的語義。
  4. no-cache,no-restore,priviate,no_etag,no_last_modified,都和緩存相關,表達的語義可以歸納為如果響應不緩存,則壓縮,其區(qū)別只在于判斷的條件的差異,當然,也可以一次性都設置上。那么為何響應不緩存就壓縮呢?官方文檔沒有描述,博主推測和使用場景有關。
    a. 不緩存意味著不會在代理服務器上保留響應副本,那么應該盡早在消息源頭壓縮,減少鏈路上的帶寬消耗。
    b. gzip是CPU密集型的使用,如果響應緩存,則可以選擇在下游代理服務器上啟用壓縮,從而分擔上游服務器的壓力。

下面是具體的配置,實踐實踐再實踐才是理解和領會相關指令和參數(shù)最有效的方法。

配置文件:

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級別已經(jīng)把gzip打開了。
		gzip_buffers 16 8k;# gzip_buffers number size;
		gzip_comp_level 6;#設置壓縮級別,缺省為1,可以不用改,級別6大約和gzip命令行缺省壓縮率相當。
		#gzip_disable "(Chrome|curl|Firefox)";#根據(jù)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;#設定最小待壓縮的文件大小,大小的依據(jù)是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;#設置是否壓縮代理請求的回應,代理請求的依據(jù)是請求頭中是否包含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參數(shù)
		#curl -H 'Accept-Encoding: gzip' test/200_accept_encoding.css --output a.css
		#curl test/200_accept_encoding.css --compressed
		#如果客戶端請求不支持的壓縮方式如br,則服務器將忽略之

		location / {
			#return 200 'ok\n';#如果使用return,則在gzip模塊生效之前就退出,所以不會壓縮。
			#Content-Length和Cotnent-Encoding不會同時出現(xiàn),因為gzip是實時動態(tài)壓縮,無法預先取得Content-Length。
			#Accept-Encoding實驗中curl必須顯示的添加Accept-Encoding頭字段,否則視為不使用壓縮方式返回響應,而瀏覽器天然會添加Accept-Encoding
			#$gzip_ratio計算的是源文件和壓縮文件的大小之比,如源文件100,壓縮文件20,則ratio為5
		}

    }


參考:ngx_http_gzip_module

相關文章:一文讀懂nginx gzip_static

總結

到此這篇關于一篇文章讀懂nginx中gzip功能的文章就介紹到這了,更多相關nginx gzip功能內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Nginx中的Rewrite的重定向配置與實踐

    詳解Nginx中的Rewrite的重定向配置與實踐

    這篇文章主要介紹了詳解Nginx中的Rewrite的重定向配置與實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • nginx 開啟 pathinfo的過程詳解

    nginx 開啟 pathinfo的過程詳解

    這篇文章主要介紹了nginx 開啟 pathinfo的過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • 在Nginx服務器中使用LibreSSL的教程

    在Nginx服務器中使用LibreSSL的教程

    這篇文章主要介紹了在Nginx服務器中使用LibreSSL的教程,LibreSSL是SSL的一個人氣軟件庫,需要的朋友可以參考下
    2015-06-06
  • LINUX中NGINX反向代理下的TOMCAT集群(詳解)

    LINUX中NGINX反向代理下的TOMCAT集群(詳解)

    下面小編就為大家?guī)硪黄狶INUX中NGINX反向代理下的TOMCAT集群(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • nginx搭建文件服務器(保姆級)

    nginx搭建文件服務器(保姆級)

    我們在工作過程中,有許多大的鏡像或者安裝包等,搭建一個文件服務器,可以高效的儲存文件,本文就來介紹一下nginx搭建文件服務器,感興趣的可以了解一下
    2023-06-06
  • 詳解metricbeat監(jiān)控nginx情況

    詳解metricbeat監(jiān)控nginx情況

    這篇文章主要介紹了詳解metricbeat監(jiān)控nginx情況,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Nginx配置動態(tài)代理后通過curl訪問報403問題

    Nginx配置動態(tài)代理后通過curl訪問報403問題

    本文主要介紹了Nginx配置動態(tài)代理后通過curl訪問報403問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 利用nginx訪問日志如何記錄mysql中的用戶id詳解

    利用nginx訪問日志如何記錄mysql中的用戶id詳解

    這篇文章主要給大家介紹了關于利用nginx訪問日志如何記錄mysql中用戶id的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。
    2017-07-07
  • 阿里云國際版使用Nginx作為HTTPS轉發(fā)代理服務器的處理方法

    阿里云國際版使用Nginx作為HTTPS轉發(fā)代理服務器的處理方法

    本文介紹了使用NGINX作為HTTPS流量轉發(fā)代理的兩種方法。它總結了NGINX使用HTTP?CONNECT隧道和NGINX流充當HTTPS轉發(fā)代理的解決方案的原則,環(huán)境構建要求,應用場景和關鍵問題
    2022-05-05
  • 利用nginx與ffmpeg搭建流媒體服務器過程詳解

    利用nginx與ffmpeg搭建流媒體服務器過程詳解

    這篇文章主要給大家介紹了利用nginx與ffmpeg搭建流媒體服務器的全過程,文中介紹的很詳細,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。
    2017-03-03

最新評論