您好,登錄后才能下訂單哦!
如何在Nginx中開啟Brotli壓縮算法?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
Brotli 是基于LZ77算法的一個現代變體、霍夫曼編碼和二階上下文建模。Google軟件工程師在2015年9月發布了包含通用無損數據壓縮的Brotli增強版本,特別側重于HTTP壓縮。
注意:使用算法的前提是啟用了 https,因為 http 請求中 request header 里的 Accept-Encoding: gzip, deflate 是沒有 br 的。
關于Brotli 算法詳細請查看:https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Brotli
瀏覽器對brotli協議的支持
各種壓縮算法的在不同level下的比較
從圖中可以看出brotli vs gzip 的壓縮算法 總體來說brotli的總體性能更好,尤其是解壓速度。我們在選擇brotli算法或gzip時,需要根據實際場景進行調優
下載Brotli
google/ngx_brotli 從 16年12月的版本起,開始內置google/brotli,所以我們不需要額外編譯bagder/libbrotli庫,讓安裝變得簡單起來。 我們將google/ngx_brotli下載并解壓到/usr/src/ngx_brotli目錄
cd /usr/src
git clone https://github.com/google/ngx_brotli.git
然后在下載google/brotli并解壓到/usr/src/ngx_brotli/deps/brotli
cd /usr/src/ngx_brotli/deps && rm -rf brotli
git clone git@github.com:google/brotli.git
cd /usr/src/ngx_brotli && git submodule update --init
編譯Brotli
nginx自1.9.11以后版本后支持動態模塊,自此,給nginx添加模塊再也不用重新編譯nginx了,通過動態模塊,你可以在運行時有有選擇性的加載第三方或Nginx官方模塊。新的實現方式通過API模塊保持盡可能的向后兼容。
下載解壓nginx安裝包
下載與當前nginx版本相同的nginx安裝包。
可通過命令,獲取當前nginx版本
nginx -v
輸出
nginx version: nginx/1.14.2
下載nginx安裝包
cd /usr/src
wget http://59.80.44.46/nginx.org/download/nginx-1.14.2.tar.gz
解壓安裝包
tar -xvf nginx-1.14.2.tar.gz
編譯動態模塊
先進入解壓后的nginx安裝包目錄,配置configure,然后用make modules。
cd nginx-1.14.2
./configure --with-compat --add-dynamic-module=/usr/src/ngx_brotli
make modules
參數語法:--add-dynamic-module=[模塊源碼所在目錄的絕對路徑]
等運行完成后,查看編譯好的模塊
ls objs/*.so
輸出:
objs/ngx_http_brotli_filter_module.so objs/ngx_http_brotli_static_module.so
將編譯好的模塊文件復制到nginx動態模塊加載目錄
cp objs/{ngx_http_brotli_filter_module.so,ngx_http_brotli_static_module.so} /etc/nginx/modules
注冊Brotli模塊
為了方便管理nginx動態模塊,建議新建一個modules.conf文件,單獨管理動態模塊。
touch /etc/nginx/modules.conf
在/etc/nginx/nginx.conf配置文件里引入modules.conf文件,找到以下內容并修改:
pid /var/run/nginx.pid;
include /etc/nginx/modules.conf;
打開/etc/nginx/modules.conf,注冊剛才編譯好的 Brotli 模塊。
# Brotli模塊
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;
啟用Brotli壓縮
Brotli和gzip是可以并存的,無需關閉gzip。
在/etc/nginx/nginx.conf開啟Brotli:
http { ... # gzip gzip on; gzip_min_length 1k; gzip_buffers 4 32k; gzip_http_version 1.1; gzip_comp_level 5; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript; gzip_vary on; gzip_proxied any; gzip_disable "MSIE [1-6]\."; # brotli brotli on; brotli_comp_level 6; brotli_buffers 16 8k; brotli_min_length 20; brotli_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml; ... }
gzip與brotli的配置詳情
gzip調優
使用gzip壓縮功能,可能為我們節約帶寬,加快傳輸速度,有更好的體驗,也為我們節約成本,所以說這是一個重點。 關于gzip詳細介紹可點擊這里;
gzip on 開啟gzip壓縮功能。
gzip_min_length 1k
設置允許壓縮的頁面最小字節數,頁面字節數從header頭的Content-Length中獲取,默認值是 0 ,不管頁面多大都進行壓縮,建議設置成大于 1K ,如果小與1K可能會越壓越大。
gzip_buffers
壓縮緩沖區大小,表示申請4個單位為32K的內存作為壓縮結果流緩存,默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果。
gzip_http_version 1.1
壓縮版本,用于設置識別HTTP協議版本,默認是 1.1 ,目前大部分瀏覽器已經支持GZIP解壓,使用默認即可。
gzip_comp_level 5
壓縮比例,用來指定gzip壓縮比,1壓縮比最小,處理速度最快,9壓縮比最大,傳輸速度快,但是處理慢,也比較消耗CPU資源。推薦設置為 5 。
gzip_types
用來指定壓縮的類型,text/html類型總是會被壓縮。
gzip_vary on
和http頭有關系,加個vary頭,給代理服務器用的,有的瀏覽器支持壓縮,有的不支持,所以避免浪費不支持的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮。
gzip_proxied any
nginx作為反向代理的時候啟用,開啟或者關閉后端服務器返回的結果,匹配的前提是后端服務器必須要返回包含Via的header頭。默認是 off 。 可選參數值:
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_disable
禁用IE6的gzip壓縮。 IE6對gzip的壓縮支持很不好,會造成頁面的假死。為了避免IE6出現問題,建議加上這個參數。
brotli調優
Google 認為互聯網用戶的時間是寶貴的,他們的時間不應該消耗在漫長的網頁加載中,因此在 2015 年 9 月 Google 推出了無損壓縮算法 Brotli。Brotli 通過變種的 LZ77 算法、Huffman 編碼以及二階文本建模等方式進行數據壓縮,與其他壓縮算法相比,它有著更高的壓塑壓縮效率。 關于brotli詳細介紹可點擊這里;
注:如果未安裝brotli模塊,此部分配置項無需配置,可略過。
brotli on
開啟brotli壓縮功能。
brotli_comp_level 6
壓縮比例,用來指定brotli壓縮比,1 壓縮比最小,處理速度最快,11 壓縮比最大,傳輸速度快,但是處理慢,也比較消耗CPU資源。默認值為 6 ,使用默認值即可。
brotli_buffers 16 8k
設置用于壓縮響應的緩沖區number和size。默認情況下,緩沖區大小等于一個內存頁面。 默認值:32 4k|16 8k。
brotli_min_length 20
設置length要壓縮的響應的最小值,長度僅由Content-Length響應頭字段確定。默認為 20 。
brotli_types
用來指定壓縮的類型,text/html類型總是會被壓縮。
gzip與brotli的配置詳情在反向代理配置文件代碼中添加:
proxy_set_header Accept-Encoding "";
范例:
server { ... location / { ... proxy_set_header Accept-Encoding ""; ... } ... }
重啟nginx,使其配置生效
systemctl restart nginx
Brotli 壓縮只能在https中生效,因為 在 http 請求中 request header 里的 Accept-Encoding: gzip, deflate 是沒有 br 的。
清理臨時文件
要養成好習慣,每次編譯完后都要把應用包解壓出來的文件或目錄進行刪除。
rm -rf /usr/src/{nginx-1.14.2/,ngx_brotli/}
最后檢查是否生效
打開網頁,用chrome開發者工具調試,在Network一欄會發現有content-encoding:br,同時網絡耗時也會明顯減少。
關于如何在Nginx中開啟Brotli壓縮算法問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。