nginx + zstd ( zstandard ) 教學

nginx + zstd ( zstandard ) 教學

chrome 系瀏覽器在撰文當下支援 gzip, deflate, br, zstd 四種壓縮方法,gzip, deflate 非常悠久也非常普及,br(brotli) 壓縮率優秀但耗時,而 zstd 就是在接近 br 的壓縮率情況下大幅減少壓縮、解壓縮所需時間。

今年也剛好是第 20 年發行日。

此處將以 ubuntu 作為示範教學。撰文當下所使用的版本依序為:nginx-1.26.2, openssl-3.3.0+quic, zstd-1.5.6, zstd-nginx-module-0.1.1。版本隨時會更新,請依看見文章時當下的最新版本操作,無須使用與文章一模一樣的版本號,並且指令中的版本號也要跟著改

更新套件資訊

sudo apt update

更新套件

sudo apt upgrade

安裝編譯套件

sudo apt install -y git build-essential libpcre3 libpcre3-dev zlib1g-dev

新增資料夾

mkdir ~/nginx_build

進入到剛剛新增的資料夾

cd ~/nginx_build

下載 nginx 原始碼

wget -c https://nginx.org/download/nginx-1.26.2.tar.gz

解壓縮 nginx 原始碼

tar zxf nginx-1.26.2.tar.gz

下載 openssl-quic 原始碼

git clone https://github.com/quictls/openssl

下載 zstandard 原始碼

git clone https://github.com/facebook/zstd

下載 zstd-nginx-module 原始碼

git clone https://github.com/tokers/zstd-nginx-module

進入 zstd 資料夾

cd zstd-1.5.6

編譯 zstd 函式庫

make lib-mt

回到上一層資料夾

cd ../

新增 zstd 函式庫臨時環境變數

export ZSTD_INC=$(pwd)/zstd-1.5.6/lib
export ZSTD_LIB=$(pwd)/zstd-1.5.6/lib

進入 nginx 資料夾

cd nginx-1.26.2

開始組態設定

./configure --with-threads --with-file-aio --with-http_ssl_module --with-http_v2_module --with-http_v3_module --add-module=../zstd-nginx-module --with-openssl=../openssl-openssl-3.3.0-quic1

開始編譯

make

測試 (如果一切都成功的話)

./nginx -V

安裝與使用(包含開機自動啟動)皆跳過,本文著重於取得跟啟用。

在 nginx.conf 中的 http 區塊加入這段

zstd on;
zstd_static off;
zstd_min_length 64;
zstd_comp_level 3; # 3 是壓縮率,數字越小,速度越快但壓縮效果差,可任意指定 1 ~ 19。
zstd_types 

text/plain text/css text/xml text/javascript 

image/x-icon image/vnd.microsoft.icon image/bmp image/svg+xml 

application/atom+xml application/geo+json 
application/javascript application/x-javascript 
application/json application/ld+json application/manifest+json 
application/rdf+xml application/rss+xml application/xhtml+xml application/xml application/xml+rss  

font/eot font/otf font/ttf;

重啟或重讀 nginx 套用設定

驗證

於支援的瀏覽器(如 Chrome)按下 F12,上方切到 Network 頁籤

點一個屬於自己網站上的檔案,且有在設定指定的內容。(此處以 js 為例)

看見 Content-Encoding: zstd 即為成功!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *