Nginxにzstdを導入して高速な高圧縮を実現する

アイキャッチ画像 環境構築
アイキャッチ画像
スポンサーリンク

Introduction

こんにちは、柳ケ瀬冬樹です。
今回はNginxにzstd圧縮を導入する手順を解説します。

私が運営しているサーバに「zstd」圧縮を導入したので、その手順を備忘録として残しておきます。
zstdは圧縮率とCPU負荷のバランスが良く、動的コンテンツの配信に適している圧縮方法です。

以前Brotliの導入を書きましたので、こちらも合わせてどうぞ!
Brotliは圧縮率が優秀である反面、圧縮速度が遅めなので静的コンテンツへの利用に向いています。

使用環境

私の検証環境は下記の通りです。
Debian系Linuxであれば、ほぼ同じ手順で進められます。
ご自身の環境とバージョンを念のためご確認ください。

OS : Ubuntu 24.04 LTS
サーバ : Nginx 1.24.0

準備

パッケージのインストール

sudo apt update
sudo apt install build-essential git wget libpcre3-dev zlib1g-dev libssl-dev libzstd-dev

zstd ソース取得

基本的な流れはBrotliと同じです。
GitHubのリポジトリをクローンしてNginxのzstdモジュールを取得します。
/usr/local/src に書き込み権限がない場合は、各コマンドの前に sudo を付けて実行してください

cd /usr/local/src
git clone https://github.com/tokers/zstd-nginx-module.git

Nginxソース 取得

こちらもBrotliと同じく、zstdモジュールを組み込むには、ご利用中のNginxと同じバージョンのソースコードが必要です。
下記のコマンドでサーバのNginxバージョンを確認し、公式サイトからそのバージョンのソースをダウンロードします。

nginx -v

私の場合は下記の実行結果になりましたので、1.24.0をダウンロードします。
nginx version: nginx/1.24.0 (Ubuntu)

cd /usr/local/src
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar xzf nginx-1.24.0.tar.gz

zstd モジュールのビルド

3. で取得したNginxソースとzstdソースから、zstdモジュールをビルドします。
この方法なら既存のNginx本体はそのままでモジュールだけを追加できます。

cd /usr/local/src/nginx-1.24.0
./configure --with-compat --add-dynamic-module=../zstd-nginx-module
make modules

下記コマンドで、zstdのビルド済みモジュールが生成されたか確認をしてください。

find objs -name "*.so" -print

成功している場合、2つのファイルが作られているかと思います。
objs/ngx_http_zstd_filter_module.so
objs/ngx_http_zstd_static_module.so

環境によっては -fPIC 関連のエラーがでて、objsディレクトリに.soファイルが作られていないことがあります。
その場合、ZSTD_INCとZSTD_LIBを明示的に指定します。

make clean

export ZSTD_INC="/usr/include"
export ZSTD_LIB="/usr/lib/x86_64-linux-gnu/libzstd.so"

./configure --with-compat --add-dynamic-module=../zstd-nginx-module
make modules

再度、find objs -name “*.so” -print を実行して.soが作成されているか確認します。
objs/ngx_http_zstd_filter_module.so
objs/ngx_http_zstd_static_module.so

これらのファイルができていれば、Nginxのmodulesへコピーします。

cp objs/ngx_http_zstd_filter_module.so /usr/lib/nginx/modules/
cp objs/ngx_http_zstd_static_module.so /usr/lib/nginx/modules/

Nginx 設定

モジュール読み込み

/etc/nginx/nginx.conf の先頭に追記して、ビルドしたzstdモジュールを読み込ませます。
(ターミナルで記述する場合は nano などのコマンドをご使用ください)

load_module modules/ngx_http_zstd_filter_module.so;
load_module modules/ngx_http_zstd_static_module.so;

nginx.confの先頭がこのようになっていればOKです!

user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;

load_module modules/ngx_http_zstd_filter_module.so;
load_module modules/ngx_http_zstd_static_module.so;

include /etc/nginx/modules-enabled/*.conf;

zstd の有効化

zstdモジュールを読み込んだら、実際にzstdによる圧縮を有効化し、どの種類のファイルで使うかなどを設定します。

  • 全サイト一括で有効にしたい場合は、/etc/nginx/nginx.confhttpブロック内に書くのがおすすめです。
  • 特定のサイトだけで有効化したい場合は、各サイトの設定ファイル(/etc/nginx/sites-available/<your-site>など)のserverlocationブロック内に記述します。
# Compress Settings Zstd
zstd on;
zstd_comp_level 6;
zstd_min_length 256;
zstd_types
	text/plain
	text/css
	text/xml
	text/javascript
	application/javascript
	application/json
	application/xml
	application/rss+xml
	image/svg+xml;

Nginxの再起動

設定を反映するためにNginxを再起動します。
再起動前に、nginx -t でエラーがないことを確認してください。

sudo nginx -t
sudo systemctl restart nginx

# ↓ systemctl が動作しない場合は
# service nginx restart

動作確認

zstdによる圧縮が有効化されているか確認してみましょう!
下記のコマンドでzstdでの圧縮を要求してサーバにリクエストをしてみます。
(http://<your-site> の部分を自分のサーバのURLに変更してください)

curl -H "Accept-Encoding: zstd" -I https://<your-site>

下記のような値が帰ってきました!
content-encoding: zstd になっていればzstdで圧縮されています!

souta@bebebe-Desktop:~$ curl -H "Accept-Encoding: zstd" -I https://<your-site>
HTTP/2 200 
server: nginx
date: Fri, 06 Mar 2026 06:42:55 GMT
content-type: application/json
vary: Accept-Encoding
access-control-allow-origin: *
content-encoding: zstd

この記事が役に立ちましたらぜひ左下のGoodボタンをお願いします!
皆様のGoodが執筆の励みになります。

コメント

タイトルとURLをコピーしました