溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Nginx使用Gzip算法對(duì)報(bào)文進(jìn)行壓縮的方法

發(fā)布時(shí)間:2020-08-17 10:15:00 來(lái)源:億速云 閱讀:400 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下Nginx使用Gzip算法對(duì)報(bào)文進(jìn)行壓縮的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

什么是HTTP壓縮

有時(shí)候客戶端和服務(wù)器之間會(huì)傳輸比較大的報(bào)文數(shù)據(jù),這時(shí)候就占用較大的網(wǎng)絡(luò)帶寬和時(shí)長(zhǎng)。為了節(jié)省帶寬,加速報(bào)文的響應(yīng)速速,可以將傳輸?shù)膱?bào)文數(shù)據(jù)先進(jìn)行壓縮,然后再進(jìn)行傳輸。

HTTP支持多種報(bào)文壓縮算法,下面是一個(gè)普通的請(qǐng)求頭,從Accept-Encoding字段可以看出支持gzip、deflate和br壓縮算法。本文我們重點(diǎn)講使用Gzip算法對(duì)報(bào)文進(jìn)行壓縮,比如Gzip來(lái)壓縮HTML,Javascript, CSS文件,壓縮完后能大大減少網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量,提高了用戶顯示網(wǎng)頁(yè)的速度。

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Host: localhost:8000
If-Modified-Since: Tue, 21 Apr 2020 14:09:01 GMT
If-None-Match: "5e9efe7d-264"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36

任何技術(shù)都是雙面的,HTTP壓縮雖然能減少帶寬占用加快響應(yīng)速度,但是因?yàn)樾枰~外的壓縮和解壓的過(guò)程,所以會(huì)占用些客戶端或服務(wù)器端的計(jì)算資源。

了解HTTP的讀者知道,可以對(duì)HTTP的報(bào)文體進(jìn)行編碼加密。其實(shí)HTTP壓縮是一種特殊的編碼方式,使用這種編碼方式可以將報(bào)文大大減少,使用對(duì)應(yīng)的解法方式又能還原最初的報(bào)文。(我們可以看出,其實(shí)壓縮技術(shù)的本質(zhì)就是一種編碼方式)

HTTP壓縮的使用場(chǎng)景

從上面對(duì)于HTTP壓縮的介紹可以看出,這種技術(shù)是一種優(yōu)化技術(shù),常常用于壓縮服務(wù)器端返回的報(bào)文以達(dá)到節(jié)省帶寬加速響應(yīng)的目的。

下面簡(jiǎn)單介紹一個(gè)HTTP使用Gzip壓縮的過(guò)程。

  • 瀏覽器發(fā)送Http request 給Web服務(wù)器, request 中有Accept-Encoding: gzip, deflate, br。 (告訴服務(wù)器,瀏覽器支持gzip壓縮)
  • Web服務(wù)器接到request后, 先生成原始的Response, 其中有原始的Content-Type和Content-Length。
  • Web服務(wù)器通過(guò)Gzip,來(lái)對(duì)Response進(jìn)行編碼, 編碼后header中有Content-Type和Content-Length(壓縮后的大小), 并且增加了Content-Encoding:gzip. 然后把Response發(fā)送給瀏覽器。
  • 瀏覽器接到Response后,根據(jù)Content-Encoding:gzip來(lái)對(duì)Response進(jìn)行解碼。 獲取到原始response后, 然后顯示出網(wǎng)頁(yè)。

客戶端也可以發(fā)送壓縮數(shù)據(jù)給服務(wù)端,通過(guò)代碼將請(qǐng)求數(shù)據(jù)解壓即可,規(guī)范起見(jiàn)同樣要在請(qǐng)求中加入Content-Encoding:gzip

用Nginx實(shí)現(xiàn)HTTP壓縮

Nginx提供了對(duì)HTTP Gzip壓縮的支持,這邊我們就來(lái)看看適應(yīng)Nginx怎么對(duì)返回報(bào)文進(jìn)行壓縮。

Nginx中通過(guò)ngx_http_gzip_module模塊、ngx_http_gzip_static_module模塊和ngx_http_gunzip_module模塊來(lái)對(duì)Gzip功能進(jìn)行支持。一般情況下Nginx默認(rèn)會(huì)編譯
這些模塊,可以通過(guò)nginx -V命令看下你安裝的nginx是否包含了這些模塊。

Gzip相關(guān)的指令可以在配置文件的http塊、server塊或者location塊中。

ngx_http_gzip_module模塊

ngx_http_gzip_module模塊主要負(fù)責(zé)Gzip功能的開啟和設(shè)置,對(duì)響應(yīng)數(shù)據(jù)進(jìn)行在線實(shí)時(shí)壓縮。該模塊包含以下主要指令。

# 開啟或者關(guān)閉Gzip功能,默認(rèn)情況下,該指令設(shè)置為off,即不啟用Gzip功能。只有將該指令設(shè)置為on時(shí),其他指令設(shè)置才有效
gzip on | off

# 設(shè)置Gzip壓縮文件使用緩存空間的大小
# 默認(rèn)值是:gzip_buffers 32 4k|16 8k
gzip_buffers number size;

# 該指令用于設(shè)定Gzip壓縮程度,包括級(jí)別1到級(jí)別9。
# 級(jí)別1表示壓縮程度最低,壓縮效率最高;級(jí)別9表示壓縮程度最高,壓縮效率最低,最費(fèi)時(shí)間。
# 默認(rèn)是1
gzip_comp_level level

# 針對(duì)不同種類客戶端發(fā)起的請(qǐng)求,可以選擇性地開啟和關(guān)閉Gzip功能。
# 支持正則表達(dá)式,其中,regex 根據(jù)客戶端的瀏覽器標(biāo)志(User-Agent,UA)進(jìn)行設(shè)置。
gzip_disable regex ...;

# 該設(shè)置使用了正則表達(dá)式,其可以匹配UC字符串中包含MSIE 4、MSIE 5和MSIE6的所有瀏覽器。
# 響應(yīng)這些瀏覽器發(fā)出的請(qǐng)求時(shí),Nginx服務(wù)器不進(jìn)行Gzip壓縮。
gzip_disable MSIE [4-6]\.;

# 早期的一些瀏覽器或者HTTP客戶端,可能不支持Gzip自解壓,因此用戶有時(shí)會(huì)看到亂碼,所以針
# 對(duì)不同的HTTP協(xié)議版本,需要選擇性地開啟或者關(guān)閉Gzip功能。該指令用于設(shè)置開啟Gzip功能的最低HTTP協(xié)議版本。
# 默認(rèn)設(shè)置為1.1版本,即只有客戶端使用1.1及以上版本的HTTP協(xié)議時(shí),才使用Gzip功能對(duì)響應(yīng)輸出數(shù)據(jù)進(jìn)行壓縮。
# 從目前來(lái)看,絕大多數(shù)的瀏覽器都支持Gzip自解壓,一般采用默認(rèn)值即可.
zip_http_version 1.0 | 1.1;

# 該指令設(shè)置頁(yè)面的字節(jié)數(shù),當(dāng)響應(yīng)頁(yè)面的大小大于該值時(shí),才啟用Gzip功能。
# 建議設(shè)置成gzip_min_length 1024;
gzip_min_length length;

# 用于設(shè)置Nginx服務(wù)器是否對(duì)后端服務(wù)器返回的結(jié)果進(jìn)行Gzip壓縮;
# 一般情況下,后端都是用來(lái)做restAPI接口,返回的數(shù)據(jù)量不會(huì)太大,不建議進(jìn)行壓縮
# 真的需要對(duì)后端返回的數(shù)據(jù)進(jìn)行壓縮是可以再看下這塊的內(nèi)容
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...;

# 設(shè)置MIME類型,被設(shè)置的類型將被壓縮,默認(rèn)值是:text/html
# 該變量還可以取“*”,表示對(duì)所有MIME類型的頁(yè)面數(shù)據(jù)進(jìn)行Gzip壓縮
# 一般可以設(shè)置成:gzip_types text/plain application/javascript text/css text/xml
gzip_types mime-type ...;

# 開啟后的效果是在響應(yīng)頭部添加了Accept-Encoding: gzip
gzip_vary on | off;

ngx_http_gzip_static_module模塊

ngx_http_gzip_static_module模塊主要負(fù)責(zé)搜索和發(fā)送經(jīng)過(guò)Gzip功能預(yù)壓縮的數(shù)據(jù)。這些數(shù)據(jù)以“.gz”作為后綴名存儲(chǔ)在服務(wù)器上。如果客戶端請(qǐng)求的數(shù)據(jù)在之前被壓縮過(guò),并且客戶端瀏覽器支持Gzip壓縮,就直接返回壓縮后的數(shù)據(jù)。

該模塊與ngx_http_gzip_module模塊的不同之處主要在于,該模塊使用的是靜態(tài)壓縮,在HTTP響應(yīng)頭部包含Content-Length頭域來(lái)指明報(bào)文體的長(zhǎng)度,用于服務(wù)器可確定響應(yīng)數(shù)據(jù)長(zhǎng)度的情況;而后者默認(rèn)使用Chunked編碼的動(dòng)態(tài)壓縮,其主要適用于服務(wù)器無(wú)法確定響應(yīng)數(shù)據(jù)長(zhǎng)度的情況,比如大文件下載的情形,這時(shí)需要實(shí)時(shí)生成數(shù)據(jù)長(zhǎng)度。

該模塊指令的使用和ngx_http_gzip_static_module模塊類似,這邊就不再具體展開了。大家可以參考官方文檔

該模塊是Nginx服務(wù)器的可選HTTP模塊,如果要使用,必須在Nginx程序配置時(shí)添加--with-http_gzip_static_module指令。

ngx_http_gunzip_module模塊

Nginx服務(wù)器支持對(duì)響應(yīng)輸出數(shù)據(jù)流進(jìn)行Gzip壓縮,這對(duì)客戶端瀏覽器來(lái)說(shuō),需要有能力解壓和處理Gzip壓縮數(shù)據(jù),但如果客戶端本身不支持該功能,就需要Nginx服務(wù)器在向其發(fā)送數(shù)據(jù)之前先將該數(shù)據(jù)解壓。這些壓縮數(shù)據(jù)可能來(lái)自于后端服務(wù)器壓縮產(chǎn)生或者Nginx服務(wù)器預(yù)壓縮產(chǎn)生。ngx_http_gunzip_module模塊便是用來(lái)針對(duì)不支持Gzip壓縮數(shù)據(jù)處理的客戶端瀏覽器,對(duì)壓縮數(shù)據(jù)進(jìn)行解壓處理的.

同樣,對(duì)這個(gè)模塊的指令使用就不具體展開了,大家可以參考官方文檔

現(xiàn)代的瀏覽器一般都支持壓縮功能,所以這個(gè)模塊使用到的幾率較小。

配置列子

gzip   on;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
gzip_types  text/plain application/xml;

為了使得Nginx服務(wù)器能夠在全局范圍內(nèi)應(yīng)用Gzip壓縮功能,可以將Gzip配置放在了http全局塊中。如果要對(duì)各個(gè)虛擬主機(jī)差別性對(duì)待,我們可以在對(duì)應(yīng)的server
塊中添加各自的Gzip配置指令;

閱讀延伸

平時(shí)開發(fā)的應(yīng)用中可能不是所有的應(yīng)用都使用了Nginx,看看其他Web服務(wù)器怎么開啟對(duì)HTTP壓縮的支持。

1. Spring Boot中內(nèi)嵌的Tomcat開啟壓縮功能

Tomcat作為servet容器+http server,也是支持gzip壓縮的。使用傳統(tǒng)的Tomcat的話,我們只需要在server.xml配置開啟HTTP壓縮即可。
在embed版本下需要通過(guò)代碼來(lái)配置。spring-boot內(nèi)置的tomcat是embed版本,通過(guò)內(nèi)置的autoconfig機(jī)制已經(jīng)做了一些默認(rèn)tomcat配置,但是對(duì)于一些不常用/高級(jí)的配置,spring-boot并沒(méi)有提供入口。

不過(guò)由于spring bean的特性,可以覆蓋默認(rèn)裝配的bean,包括tomcat相關(guān)的配置。使用TomcatConnectorCustomizer接口可以開啟壓縮配置。

public class ConnC1 implements TomcatConnectorCustomizer{

 @Override
 public void customize(Connector connector) {
  ProtocolHandler protocolHandler = connector.getProtocolHandler();
  if(protocolHandler instanceof Http11NioProtocol){
   Http11NioProtocol http11NioProtocol = (Http11NioProtocol)protocolHandler;
   http11NioProtocol.setCompression("on");//default off
   http11NioProtocol.setCompressibleMimeType();
   http11NioProtocol.setCompressionMinSize(2048);//default 2048(B)
   http11NioProtocol.setMaxKeepAliveRequests(1);//default 200
  }
 }
}

關(guān)于Tomcat對(duì)于HTTP壓縮的支持,大家可以從Tomcat的CompressionConfig這個(gè)類開始尋找線索。

其實(shí)如果只是簡(jiǎn)單開啟對(duì)壓縮功能的支持的話,只要在Spring Boot做下面的配置即可:

server:
 compression:
 enabled: true
 min-response-size: 1024
 mime-types:
  application/json

看完了這篇文章,相信你對(duì)Nginx使用Gzip算法對(duì)報(bào)文進(jìn)行壓縮的方法有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI