溫馨提示×

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

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

Nginx請(qǐng)求壓縮如何實(shí)現(xiàn)

發(fā)布時(shí)間:2023-03-09 14:40:10 來(lái)源:億速云 閱讀:240 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容主要講解“Nginx請(qǐng)求壓縮如何實(shí)現(xiàn)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Nginx請(qǐng)求壓縮如何實(shí)現(xiàn)”吧!

一、介紹

請(qǐng)求壓縮,是將服務(wù)器的結(jié)果通過(guò) Nginx 將內(nèi)容進(jìn)行壓縮后,在發(fā)送給客戶端,降低網(wǎng)絡(luò)傳輸壓力,提升傳輸效率。

常見(jiàn)的兩種請(qǐng)求方式是: gzip 、brotli(Google),相當(dāng)于 brotli 的效率會(huì)高,后續(xù)內(nèi)容詳解。

請(qǐng)求壓縮的話分為:動(dòng)態(tài)壓縮,靜態(tài)壓縮,動(dòng)態(tài)壓縮會(huì)導(dǎo)致 Nginx內(nèi)部的 sendfile 失效。對(duì)于一些不變的內(nèi)容可以使用靜態(tài)壓縮,提升請(qǐng)求效率 。

用于請(qǐng)求結(jié)果的壓縮,需要客戶端和服務(wù)器雙方支持壓縮協(xié)議,在服務(wù)器進(jìn)行結(jié)果的壓縮,客戶端進(jìn)行數(shù)據(jù)解壓縮,在壓縮會(huì)占用服務(wù)器端一些性能效率,這個(gè)損耗根據(jù)壓縮的等級(jí)來(lái)定,等級(jí)越高,耗損越大??梢詼p少網(wǎng)絡(luò)傳輸壓力。

壓縮只針對(duì)于 代理方式請(qǐng)求才生效。

二、請(qǐng)求壓縮的流程

Nginx請(qǐng)求壓縮如何實(shí)現(xiàn)

執(zhí)行的流程是:客戶端向服務(wù)器端發(fā)送請(qǐng)求,nginx 接收請(qǐng)求之后,會(huì)向上游服務(wù)器服務(wù)器發(fā)送請(qǐng)求,Nginx和上游服務(wù)器之間會(huì)創(chuàng)建網(wǎng)絡(luò)通道,之間會(huì)進(jìn)行數(shù)據(jù)的傳輸,在這里如果是開(kāi)啟了壓縮操作,那么Nginx會(huì)將結(jié)果數(shù)據(jù)進(jìn)行壓后,在將數(shù)據(jù)返回給客戶端,在瀏覽器接收到nginx的請(qǐng)求,會(huì)先處理請(qǐng)求頭,發(fā)現(xiàn)有 壓縮協(xié)議,那么就會(huì)判斷當(dāng)前瀏覽器是否支持該協(xié)議,如果支持則會(huì)將數(shù)進(jìn)行解壓的操作并數(shù)據(jù)展示給用戶。

開(kāi)啟壓縮之后用戶是無(wú)感的,可以降低傳輸壓力,但是圖片和視頻就不建議壓縮了,因?yàn)楹蟮拇笮∽兓淮?,gzip是網(wǎng)絡(luò)傳輸?shù)膲嚎s的,需要客戶端支持,服務(wù)器端也需要支持,將傳輸?shù)臄?shù)據(jù)進(jìn)行壓縮,將傳輸數(shù)據(jù)變小,我們可以設(shè)置下,當(dāng)然壓縮必越高,解壓縮和壓縮的時(shí)間更長(zhǎng),服務(wù)器端壓力會(huì)大些。

三、Gzip壓縮

3.1 gzip介紹

Gzip是GNUzip的縮寫,最早用于UNIX系統(tǒng)的文件壓縮。HTTP協(xié)議上的Gzip編碼是一種用來(lái)改進(jìn)Web應(yīng)用程序性能的技術(shù),Web服務(wù)器和客戶端(瀏覽器)必須共同支持Gzip。目前主流瀏覽器:Chrome、Firefox等都支持該協(xié)議,常見(jiàn)的服務(wù)器:Apache、Nginx、IIS同樣支持Gzip。

Gzip的壓縮比率在3-10倍左右(純文本),可以大大節(jié)省服務(wù)器的網(wǎng)絡(luò)帶寬。在實(shí)際應(yīng)用中,并不是對(duì)所有文件進(jìn)行壓縮,通常只壓縮靜態(tài)文件(js\css\html)。JPEG這類文件用Gzip壓縮的不夠好,而且壓縮也是耗費(fèi)CPU資源的。

那么Gzip是如何進(jìn)行壓縮的呢?簡(jiǎn)單來(lái)說(shuō),Gzip壓縮是在一個(gè)文本文件中找出類似的字符串,并臨時(shí)替換他們,使整個(gè)文件變小。這種形式的壓縮對(duì)Web來(lái)說(shuō)非常合適,因?yàn)镠TML和CSS文件通常包含大量的重復(fù)字符串,例如空格、標(biāo)簽等。

Nginx請(qǐng)求壓縮如何實(shí)現(xiàn)

3.2 gzip的使用

gzip模塊是Nginx中內(nèi)置的,所以不需要添加其他的默認(rèn),只要配置安裝好Nginx既可。

使用作用域: http , server , location

Nginx 如下配置

gzip on ;

  • 是否開(kāi)啟壓縮。

  • 默認(rèn)值:gzip off默認(rèn)關(guān)閉

gzip_buffers 32 4k | 16 8k

  • 壓縮緩沖區(qū)大小。

  • 默認(rèn)值 : gzip_buffers 32 4k | 16 8k

gzip_comp_level 1 ;

  • 壓縮等級(jí) 1-9 ,數(shù)字越大壓縮比越高。

  • 越小壓縮速度和解壓縮速度越快,壓縮占比越小

  • 默認(rèn)值 :gzip_comp_leve 1

gzip_http_version 1.1

  • 使用gzip 的最小的http版本。

gzip_min_length

  • 設(shè)置將被 gzip 壓縮的響應(yīng)的最小長(zhǎng)度。長(zhǎng)度僅由 "Content-Length" 響應(yīng)報(bào)頭字段確定。

gzip_proxied 多選

  • 對(duì)于上游服務(wù)器返回不同的head來(lái)決定是不是要進(jìn)行壓縮,兩種常見(jiàn)的一種off一種any

  • 一般啟用cache的話都是已經(jīng)進(jìn)行過(guò)壓縮的所有可以規(guī)避一些細(xì)節(jié)

  • off 為不做限制。

  • 作為反向代理時(shí),針對(duì)于上游服務(wù)器返回的頭信息進(jìn)行壓縮。

  • 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 - 無(wú)條件啟用壓縮。

gzip_vary on ;

  • 增加一個(gè)header ,適配老的瀏覽器 Vary : Accept-Encoding

gzip_types :

  • 哪些 mime類型的文件進(jìn)行壓縮。

gzip_disable :

  • 禁止哪些瀏覽器使用gzip。

  • 建議不要配置

  • 默認(rèn)值 : gzip_disable 'msie6MSIE [4-6]\.MSIE 6.0'

location / {
  
  gzip off ;  # 開(kāi)啟gzip壓縮
  gzip_buffers 32 4k ; # 設(shè)置緩沖區(qū)大小
  gzip_comp_level 5; # 設(shè)置壓縮等級(jí) 1-9 
  gzip_disable 'msie6MSIE [4-6]\.MSIE 6.0';  # 禁止哪些瀏覽器不使用壓縮
  gzip_http_version 1.1; # 設(shè)置壓縮所需要的最低的http版本。 
  gzip_min_length 20 ; # 設(shè)置響應(yīng)的數(shù)據(jù)最小限制,在這個(gè)限制之后再回進(jìn)行壓縮
  gzip_vary on ; # 增加一個(gè)header ,適用于老的瀏覽器 Vary:Accept-Encoding 
  gzip_proxied any; # 無(wú)條件啟動(dòng)壓縮
  # 哪些mime類型的文件進(jìn)行壓縮 
  #gzip_types text/plain application/x-javascript text/css application/xml; 
  gzip_types
    text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
    text/javascript application/javascript application/x-javascript
    text/x-json application/json application/x-web-app-manifest+json
    text/css text/plain text/x-component
    font/opentype application/x-font-ttf application/vnd.ms-fontobject
    image/x-icon;
}

3.3 gzip的請(qǐng)求

Nginx請(qǐng)求壓縮如何實(shí)現(xiàn)

當(dāng)啟動(dòng)了gzip,我們的請(qǐng)求到nginx服務(wù)器上,nginx就已經(jīng)給我們生產(chǎn)了response heard 但是數(shù)據(jù)還沒(méi)有生成,他也不知道具體數(shù)據(jù)有多大,因?yàn)閚ginx是異步響應(yīng)式請(qǐng)求,他一步一步來(lái)的,他先把header準(zhǔn)備好然后請(qǐng)求內(nèi)容去壓縮,最后將兩塊內(nèi)容合并去壓縮,最后發(fā)過(guò)來(lái),也就是因?yàn)楫惒綄?dǎo)致他不知道具體大小。

他是先將請(qǐng)求頭返回然后數(shù)據(jù)在慢慢讀。

----------------------------------響應(yīng)體-------------------------------------------------
Connection: keep-alive
Content-Encoding: gzip # 結(jié)果啟動(dòng)了gzip壓縮 
Content-Type: application/json # 響應(yīng)結(jié)果 
Date: Mon, 13 Feb 2023 09:13:19 GMT
Keep-Alive: timeout=65
Server: nginx/1.20.2
Transfer-Encoding: chunked # 傳輸?shù)母袷竭@個(gè)對(duì)應(yīng)的就是length,這個(gè)是他會(huì)發(fā)送一個(gè)一個(gè)的包,當(dāng)最后一個(gè)包是0表示傳輸結(jié)束
Vary: Accept-Encoding
 
 
 
------------------------------------請(qǐng)求頭-----------------------------------------------
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cache-Control: max-age=0
Connection: keep-alive
Host: 192.168.101.128
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36

注意:以上是動(dòng)態(tài)壓縮就是所有的請(qǐng)求都會(huì)經(jīng)歷一次壓縮,這個(gè)有一個(gè)致命的缺點(diǎn)就是不支持sendfile,sendfile是數(shù)據(jù)零拷貝,不會(huì)將數(shù)據(jù)加載到nginx,而是通過(guò)網(wǎng)絡(luò)接口傳遞數(shù)據(jù),但是一旦開(kāi)啟了 gzip動(dòng)態(tài)壓縮會(huì)導(dǎo)致sendfile失效,可以使用靜態(tài)壓縮。

在多層 Nginx時(shí),建議和服務(wù)器創(chuàng)建連接的Nginx進(jìn)行開(kāi)啟Gzip 就可以了,這樣就會(huì)支持gzip,在任意一臺(tái)開(kāi)啟都是會(huì)開(kāi)啟的gzip的 。

3.4 靜態(tài)壓縮

Nginx請(qǐng)求壓縮如何實(shí)現(xiàn)

為什么要使用靜態(tài)壓縮呢?

首先動(dòng)態(tài)壓縮無(wú)法使用 sendfile 而靜態(tài)壓縮則完美的解決了這個(gè)問(wèn)題。

靜態(tài)壓縮是一個(gè)互補(bǔ)或者說(shuō)是一個(gè)擴(kuò)展的功能,他可以把請(qǐng)求的這些資源文件,我們可以預(yù)先的將內(nèi)容進(jìn)行壓縮成一個(gè)壓縮包。

首先靜態(tài)的資源一定是要比動(dòng)態(tài)的資源要效率高,通過(guò)壓縮之后可以減少磁盤的大小,并且還可以節(jié)約網(wǎng)絡(luò)的通道資源。

什么是靜態(tài)壓縮

靜態(tài)壓縮不適合反向代理只適合資源服務(wù)器,他可以把壓縮的文件傳遞給客戶端,靜態(tài)壓縮就是在資源路徑下會(huì)有一個(gè)資源文件還會(huì)有一個(gè)對(duì)應(yīng)名稱的壓縮包。 并且Nginx會(huì)優(yōu)先找壓縮包,直接通過(guò) sendfile 將數(shù)據(jù)傳遞過(guò)去。

Nginx 將壓縮的文件通過(guò)網(wǎng)絡(luò)發(fā)送過(guò)去,然后當(dāng)瀏覽器接收到Nginx發(fā)送的壓縮包文件,并進(jìn)行解壓縮的操作。他會(huì)在發(fā)送給客戶端之前將壓縮包接口在發(fā)送給客戶端。

3. 配置

該http_gzip_static_module模塊允許發(fā)送帶有“”文件擴(kuò)展名的預(yù)壓縮文件,.gz而不是常規(guī)文件。默認(rèn)情況下不構(gòu)建此模塊,應(yīng)使用 --with-http_gzip_static_module 配置參數(shù)啟用它。這個(gè)模塊沒(méi)有在預(yù)編譯的包里,需要手動(dòng)添加,這個(gè)模塊的作用就是把壓縮包解壓開(kāi)

with是內(nèi)部模塊,add是外部的模塊。

首次安裝 nginx時(shí)使用

./configure --prefix==/usr/local/nginx --with-hhtp_gzip_static_module
make && make install

已經(jīng)安裝過(guò) nginx,對(duì)nginx客戶端升級(jí)時(shí)使用命令

./configure --prefinx==/usr/local/nginx --with-http_gzip_static_module

make不要make install 否則會(huì)覆蓋之前的文件

在將 objs的nginx 程序拷貝到 /usr/local/nginx/sbin 下·,注意需要做好原 nginx 程序備份 。

語(yǔ)法 : gzip_static on | off | always;

作用:是否開(kāi)啟靜態(tài)壓縮功能。

參數(shù)值:

  • on :開(kāi)啟靜態(tài)壓縮,并會(huì)檢測(cè)瀏覽器是否支持,如果不支持則不會(huì)走靜態(tài)壓縮,

  • off :關(guān)閉靜態(tài)壓縮

  • always:是否使用靜態(tài)壓縮,無(wú)論瀏覽器是否支持靜態(tài)壓縮功能。

    • 這樣就會(huì)引發(fā)一個(gè)問(wèn)題,如果客戶端不支持,就解不開(kāi) ,如果磁盤上沒(méi)有未壓縮的文件默認(rèn)會(huì)報(bào)404,可以配合 ngx_http_gunzip_module ,模塊使用。

  • 默認(rèn)值:gzip_static on

  • 適用于 :http、server、location

使用的需要將本地的資源文件進(jìn)行壓縮 ,壓縮成 xxx.gz的文件

cd /usr/local/nginx/html 
gzip *

注意:開(kāi)啟之后默認(rèn)就會(huì)先訪問(wèn) .gz 的文件了,如果不支持 靜態(tài)壓縮則會(huì)訪問(wèn) 正常文件,如果沒(méi)有正常的文件只有 .gz 那么就會(huì)報(bào)錯(cuò) 。

4. nginx_http_gunzip_module 模塊

Nginx請(qǐng)求壓縮如何實(shí)現(xiàn)

這個(gè)模塊是配合 gzip_static always時(shí)使用的 ,因?yàn)?當(dāng)配置程 always 時(shí),所有的請(qǐng)求會(huì)都進(jìn)行找壓縮文件,在文件存不存在或者說(shuō)瀏覽器支不支持 靜態(tài)壓縮,nginx都會(huì)將靜態(tài)壓縮文件返回給瀏覽器,如果瀏覽器不支持的話會(huì)導(dǎo)致文件解不開(kāi),也就是 404 。

這個(gè)模塊它沒(méi)有在預(yù)編譯的包里,需要手動(dòng)添加,這個(gè)模塊的作用就是把靜態(tài)的壓縮包解壓開(kāi),他會(huì)在發(fā)送給客戶端之前將壓縮包接口在發(fā)送給客戶端,它相當(dāng)于是一層攔截器,它的作用就是可以把源文件進(jìn)行壓縮,我們可以把源文件進(jìn)行刪除了,節(jié)省磁盤空間,但是一般會(huì)用到。

注意 : with 是內(nèi)部 、 add 是外部的

安裝命令 :

./configure --prefix=/usr/local/nginx --add-module=/tools/nginx-sticky --with-http_gzip_static_module --with-http_gunzip_module

make

如果是替換的話,則將這個(gè)文件中的這個(gè)文件 cp 到 nginx的安裝目錄下的 sbin

Nginx請(qǐng)求壓縮如何實(shí)現(xiàn)

移動(dòng)命令:

 cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old2
 
 cd /tools/nginx/objs 
 mv nginx /usr/local/nginx/sbin/

這里沒(méi)有g(shù)zip,但也沒(méi)有 context-length 因?yàn)閚ginx需要把文件解壓縮,他也不知道具體文件有多大,這個(gè) gzip_static 適用場(chǎng)景 :在作為cdn服務(wù)器或者 cdn上游服務(wù)器文件存儲(chǔ)服務(wù)器時(shí),我們就可以把本地原始文件刪了,只展示zip 包,把解壓縮的壓力丟棄給客戶端 , 同時(shí)可以把本地壓縮等級(jí),提高不是 gzip的壓縮等級(jí) ,經(jīng)常高配訪問(wèn)的一些頁(yè)面 css js ,也可以通過(guò) static壓縮。

Nginx請(qǐng)求壓縮如何實(shí)現(xiàn)

靜態(tài)壓縮 響應(yīng)結(jié)果會(huì)有 Context-Encoding : gzip 、Conten-Length:392 有展示 context-length 表示他開(kāi)啟了靜態(tài)壓縮,預(yù)壓縮直接返回zip包 沒(méi)有源文件 ,1.速度快,2節(jié)省服務(wù)器資源。

四、Brotli

Brotli 是 Google 推出的開(kāi)源壓縮算法,通過(guò)變種的 LZ77 算法、Huffman 編碼以及二階文本建模等方式進(jìn)行數(shù)據(jù)壓縮,與其他壓縮算法相比,它有著更高的壓縮效率,性能也比我們目前常見(jiàn)的 Gzip 高17-25%,可以幫我們更高效的壓縮網(wǎng)頁(yè)中的各類文件大小及腳本,從而提高加載速度,提升網(wǎng)頁(yè)瀏覽體驗(yàn)。需要說(shuō)明的是 Brotli 壓縮只在 https 下生效,因?yàn)?在 http 請(qǐng)求中 request header 里的 Accept-Encoding: gzip, deflate 是沒(méi)有 br 的。

Brotli 如此高的壓縮比率,得益于其使用一個(gè)預(yù)定義的字典,該字典包含超過(guò) 13000 個(gè)來(lái)自文本和 HTML 文檔的大型語(yǔ)料庫(kù)的常用字符串,預(yù)定義的算法可以提升較小文件的壓縮密度,而壓縮與解壓縮速度則大致不變。

Brotli 憑借它優(yōu)異的壓縮性能迅速占領(lǐng)了市場(chǎng),從下圖可以看到,除了 IE 和 Opera Mini 之外,幾乎所有的主流瀏覽器都已支持 Brotli 算法,因此處于資源占用的考慮,比如說(shuō)流量,建議啟用:

Brotil 規(guī)范由 Google 員工 Jyrki Alakuijala 和 Zoltan Szabadka 于 2013-2016開(kāi)發(fā),并伴隨著規(guī)范的倆個(gè)作者Evgenii Kuliuchniko 和 Lode Vandevenne共同開(kāi)發(fā)的參考實(shí)現(xiàn),后者之前開(kāi)發(fā)了谷歌的zopfli在2013年重新實(shí)現(xiàn)了收縮 /gzip 壓縮格式。與zopfli不同,后者是對(duì)現(xiàn)有數(shù)據(jù)格式規(guī)范的重新實(shí)現(xiàn),Brotli 是一種新的數(shù)據(jù)格式,并允許作者進(jìn)一步提高壓縮比。

4.1 Brotli 概述

Brotli 的編碼器提供了 12 個(gè)質(zhì)量級(jí)別 (從 0 到 11)。它們是壓縮速度換取壓縮效率的壓縮模式:更高質(zhì)量的幾倍速度較慢,但會(huì)產(chǎn)生更好的壓縮比。

一個(gè) Brotli 壓縮文件由 元塊(meta-blocks)集合組成。每個(gè)元塊最多可容納 16 MiB,由倆部分組成:一個(gè) 數(shù)據(jù)部分(data part),它存儲(chǔ) LZ77 壓縮的放入快,以及一個(gè) 標(biāo)題(header),每個(gè)塊的壓縮遵循經(jīng)典的 ①LZ77 壓縮方案并由 ②計(jì)算具有良好的LZ77解析和計(jì)算 LZ 短語(yǔ)的簡(jiǎn)潔編碼這倆個(gè)主要階段組成。

它效率高是因?yàn)閮?nèi)置了 n多個(gè)字典,包含都是一些常見(jiàn)的文件文件 css 、js 等等一些標(biāo)簽,如果我們將這些標(biāo)簽歸類生成一個(gè)字典之后,我們就可以按照序號(hào)去解壓這個(gè)文件了。

并且它在 Nginx 中話是可以和 Gzip 共存,開(kāi)啟了Brotli 不會(huì)導(dǎo)致 Gzip失效,如果瀏覽器支持brotli 那么優(yōu)先使用 Brotli ,不支持在使用 Gzip。

4.2 Brotli 的安裝

--add-dynamic-module表示動(dòng)態(tài)的引入模塊在配置文件中還需要單獨(dú)加入 load_module path/xxx

官網(wǎng)

  • https://github.com/google/ngx_brotli

  • https://codeload.github.com/google/brotli/tar.gz/refs/tags/v1.0.9

下載 倆個(gè)項(xiàng)目

解壓縮

  • brotli-1.0.9 是 brotli 算法模塊,需要先解壓。

    • tar -zxvf brotli-1.0.9.tar.gz

  • ngx_brotli-1.0.0rc 是nginx的 brotli的模塊。這模塊里需要引入 brotli 算法模塊

    • tar -zxvf ngx_brotli-1.0.0rc.tar.gz

接下來(lái)講 brotli 的內(nèi)容全部 復(fù)制到 ngx_brotli 的 deps/brotli/目錄

  • cd /tools/brotli-1.0.9

  • cp -r * /tools/ngx_brotli-1.0.0rc/deps/brotli/

模塊化編譯 :

./configure --with-compat --add-dynamic-module=/tools/ngx_brotli-1.0.0rc --prefix=/usr/local/nginx/

--add-dynamic-module=brotli目錄

加載所有的壓縮模塊

./configure --with-compat --add-dynamic-module=/tools/ngx_brotli-1.0.0rc --prefix=/usr/local/nginx/ --add-module=/tools/nginx-sticky --with-http_gzip_static_module --with-http_gunzip_module

make && make install

下載的兩個(gè)模塊 拷貝到 /usr/local/nginx/modules/

Nginx請(qǐng)求壓縮如何實(shí)現(xiàn)

首先在 /usr/local/nginx創(chuàng)建一個(gè)modules文件夾 mkdir modules

mv ngx_http_brotli_filter_module.so ngx_http_brotli_static_module.so /usr/local/nginx/modules/

最后將新編譯的 nginx 啟動(dòng)程序復(fù)制到 /usr/local/nginx/sbin下 做好之前程序復(fù)制。

  • cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.oid3

  • mv /tools/nginx-12.0/objs/nginx /usr/local/nginx/sbin/

在配置文件中動(dòng)態(tài)加載模塊

load_module "/usr/local/nginx/modules/ngx_http_brotli_filter_module.so";
load_module "/usr/local/nginx/modules/ngx_http_brotli_static_module.so";

4.3 配置選項(xiàng)

具體的配置選項(xiàng)可以查看GitHub: https://github.com/google/ngx_brotli

brotli的配置可以參考Gzip的配置,幾乎一致。

brotli

  • 語(yǔ)法:brotli on | off

  • 默認(rèn)值 :brotli off

  • 適用于: http、server、location、if

  • 作用:開(kāi)啟或者禁用brotli 壓縮功能。

brotli_static

  • 語(yǔ)法:brotli_static on | off | always

  • 默認(rèn)值:brotli_static off

  • 適用于:http、server、location

  • 作用:brotli 也是支持預(yù)先壓縮文件,啟用或禁用檢查是否存在帶擴(kuò)展名的預(yù)壓縮文件.br 。使用該always值,在所有情況下都使用預(yù)壓縮文件,而不檢查客戶端是否支持它。

brotli_types

  • 語(yǔ)法:brotli_types <mime_type> [...]

  • 默認(rèn)值:brotli_types text/html

  • 適用于: http、server、location

  • 作用:指定哪些資源類型需要進(jìn)行壓縮操作,特殊值*匹配任何 MIME類型。

brotli_buffers

  • 語(yǔ)法:brotli_buffers <number> <size>

  • 默認(rèn)值: 32 4k | 16 8 k

  • 適用于: http、server、location

  • 作用:設(shè)置壓縮緩沖區(qū)大小,最新版本以及棄用了 。

brotli_comp_level

  • 語(yǔ)法:brotli_comp_level <level>

  • 默認(rèn)值 :6'

  • 適用于 : http、server、location

  • 作用 : 設(shè)置即時(shí)壓縮 Brotli 質(zhì)量(壓縮)level。0可接受的值在從到 的范圍內(nèi)11。

brotli_window

  • 語(yǔ)法:brotli_window <size>

  • 默認(rèn)值 : 512k

  • 適用于 :http、server、 location

  • 作用:設(shè)置 Brotli 窗口size。可以比作是一個(gè)桌子,將要壓縮的文件同時(shí)放在這個(gè)桌子上,這個(gè)桌子上可以放多少文件的大小,這個(gè)值也不越大越好,他比較占內(nèi)存,值增加建議是2的倍數(shù),可接受的值為1k, 2k, 4k, 8k, 16k, 32k, 64k, 128k, 256k, 512k, 1m, 2m,和4m。8m 16m

brotli_min_length

  • 語(yǔ)法:brotli_min_length <length>

  • 默認(rèn)值:20

  • 適用于: http、server、location

  • 作用:指定進(jìn)行壓縮的文件最小的長(zhǎng)度,如果小于這個(gè)值則不壓縮。

#加載動(dòng)態(tài)模塊 
load_module "/usr/local/nginx/modules/ngx_http_brotli_filter_module.so";
load_module "/usr/local/nginx/modules/ngx_http_brotli_static_module.so";
worker_processes  1;
events {
    worker_connections  1024;
}
 
http {
    server {
    listen       80;
    server_name  localhost;
        location  / {
          #brotli配置 
          brotli on;  # 開(kāi)啟 壓縮
        brotli_static on; # 是否開(kāi)啟預(yù)先壓縮,開(kāi)啟之后就會(huì) .br的壓縮包
          brotli_comp_level 6; # 壓縮等級(jí)
          brotli_buffers 16 8k; # 緩沖區(qū)大小 ,已經(jīng)啟用 
          brotli_min_length 20; # 壓縮時(shí)文件最小限制 
          # 對(duì)哪些mime.types類型進(jìn)行壓縮
          brotli_types text/plain text/css text/javascript application/javascript text/xml application/xml application/xml+rss application/json image/jpeg image/gif image/png;
    
          }
  }
}

4.4 brotli 測(cè)試

因?yàn)槟J(rèn) brotli 是必現(xiàn) https 請(qǐng)求才能使用的,因?yàn)?http的請(qǐng)求 請(qǐng)求頭的 Accept-Encoding 是沒(méi)有 br的,所以服務(wù)器是無(wú)法知道客戶端可以使用的。

測(cè)試方案:

使用 linux 的 curl 命令 :

curl -H 'Accept-Encding : br' -I 192.168.101.128/index.html
[root@localhost sbin]# curl -H Accept-Encoding:br  -I http://192.168.101.128/static_page.html
HTTP/1.1 200 OK
Server: nginx/1.20.2
Date: Fri, 17 Feb 2023 08:11:05 GMT
Content-Type: text/html
Last-Modified: Fri, 17 Feb 2023 03:28:14 GMT
Connection: keep-alive
Keep-Alive: timeout=65
Vary: Accept-Encoding
ETag: W/"63eef44e-31"
Content-Encoding: br
[root@localhost sbin]# curl  -I http://192.168.101.128/static_page.html
HTTP/1.1 200 OK
Server: nginx/1.20.2
Date: Fri, 17 Feb 2023 08:11:54 GMT
Content-Type: text/html
Last-Modified: Fri, 17 Feb 2023 03:28:14 GMT
Connection: keep-alive
Keep-Alive: timeout=65
Vary: Accept-Encoding
ETag: W/"63eef44e-31"

到此,相信大家對(duì)“Nginx請(qǐng)求壓縮如何實(shí)現(xiàn)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向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