2026年10月17日

2026年10月17日

Nginx で Brotli 圧縮を有効にする方法|ngx_brotli の導入・設定・確認と WordPress での注意点

Nginx で Brotli 圧縮を有効にするには、ngx_brotli モジュールを Nginx に読み込ませ、brotli on; と対象の MIME タイプを設定して再読み込みする、という 3 段階で済みます。Nginx 本体には Brotli の機能が含まれていないため、最初のモジュール導入が作業の大半です。

結論を先にまとめます。

  • Brotli は gzip より小さく圧縮できる方式で、主要なブラウザーは HTTPS のページでだけ Accept-Encoding: br を送ります。HTTP のままのサイトでは有効にしても使われません。
  • モジュールは Debian / Ubuntu の apt で入る版がある環境と、Nginx と同じ版のソースから自分でビルドする環境に分かれます(2026年11月現在、nginx.org の公式パッケージには含まれていません)。
  • gzip は止めずに併用します。Brotli に対応しないクライアントには gzip が使われます。
  • WordPress では、キャッシュプラグインが作る静的 HTML と、Cloudflare などの CDN を使っているかどうかで、設定する場所が変わります。
Nginx で Brotli を有効にする 4 段階。現状の確認、モジュールの導入、設定の追加、反映と確認

Brotli とは

Brotli とは、Google が公開している可逆圧縮の方式で、Web ではテキスト系のファイル(HTML・CSS・JavaScript・SVG・JSON など)を gzip より小さく転送するために使います。HTTP の応答ヘッダーでは Content-Encoding: br と表されます。圧縮レベルは 0〜11 で、レベルを上げるほど小さくなる代わりに CPU 時間がかかります。画像や動画、zip のようにすでに圧縮されているファイルには効果がないので対象から外します。

Nginx 側の実装は google/ngx_brotli で、次の 2 つのモジュールから成ります。

モジュール 役割 主な設定
ngx_http_brotli_filter_module 応答をその場で圧縮する brotli、brotli_comp_level、brotli_types、brotli_min_length
ngx_http_brotli_static_module あらかじめ作っておいた .br ファイルをそのまま返す brotli_static

手順 1: 現状を確認する

作業の前に、いま何が返っているかを見ておきます。HTTPS の URL に対して br を受け付けると伝え、content-encoding を確認します。

curl -sI -H "Accept-Encoding: br, gzip" https://example.com/ | grep -i -E "content-encoding|server"

content-encoding: gzip なら gzip だけが有効、何も出なければ圧縮なしです。あわせて Nginx の版と、すでに読み込まれているモジュールを確認します。

nginx -v
nginx -V 2>&1 | tr ' ' '\n' | grep -i brotli
ls /etc/nginx/modules-enabled/ 2>/dev/null

nginx -V の出力に brotli が無ければ、モジュールの導入から始めます。

手順 2: ngx_brotli を導入する

配布パッケージで入る場合(Debian / Ubuntu)

Debian / Ubuntu の Nginx(apt で入れた nginx パッケージ)向けには、Brotli のモジュールがパッケージとして用意されている版があります。まず検索します。

apt search brotli 2>/dev/null | grep -i nginx

libnginx-mod-http-brotli-filter と libnginx-mod-http-brotli-static(名前は配布版で異なることがあります)が見つかれば、それを入れるだけで /etc/nginx/modules-enabled/ に読み込み設定が置かれます。

sudo apt install libnginx-mod-http-brotli-filter libnginx-mod-http-brotli-static
nginx -t && sudo systemctl reload nginx

見つからない場合や、nginx.org の公式リポジトリから Nginx を入れている場合は、次のソースからのビルドに進みます。

ソースからビルドする場合

動的モジュールは、動かしている Nginx とまったく同じ版のソースでビルドする必要があります。版が違うと読み込み時に「module is not binary compatible」で起動に失敗します。

# 1. 動いている Nginx の版と configure 引数を控える
nginx -v
nginx -V

# 2. 同じ版のソースと ngx_brotli を取得
cd /usr/local/src
curl -LO https://nginx.org/download/nginx-1.26.3.tar.gz   # 版は nginx -v に合わせる
tar xzf nginx-1.26.3.tar.gz
git clone --recurse-submodules -j8 https://github.com/google/ngx_brotli

# 3. 動的モジュールとしてビルド(nginx -V の引数に --add-dynamic-module を足す)
cd nginx-1.26.3
./configure --with-compat --add-dynamic-module=../ngx_brotli
make modules

# 4. できた .so を Nginx のモジュール置き場へ
sudo cp objs/ngx_http_brotli_filter_module.so objs/ngx_http_brotli_static_module.so /etc/nginx/modules/

ビルドには build-essential、cmake、libpcre2-dev、zlib1g-dev、libssl-dev などが必要です。手順の詳細と最新の注意点は ngx_brotli の README を確認してください。

読み込み設定

ビルドした場合は、nginx.conf の先頭(events ブロックより前)でモジュールを読み込みます。パッケージで入れた場合はこの設定が自動で置かれるので不要です。

load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;

手順 3: 圧縮の設定を書く

http ブロック、または対象の server ブロックに書きます。gzip の設定は残したままで構いません。

# Brotli(対応ブラウザー向け)
brotli            on;
brotli_comp_level 6;
brotli_static     on;
brotli_min_length 1000;
brotli_types
    text/plain text/css text/xml text/javascript
    application/javascript application/x-javascript application/json
    application/xml application/rss+xml application/atom+xml
    image/svg+xml font/ttf font/otf application/vnd.ms-fontobject;

# gzip(Brotli 非対応のクライアント向け。既存の設定があればそのまま)
gzip         on;
gzip_vary    on;
gzip_types   text/plain text/css text/xml text/javascript application/javascript application/json application/xml image/svg+xml;

各設定の意味は次のとおりです。

設定 意味 目安
brotli on 応答をその場で Brotli 圧縮する —
brotli_comp_level 圧縮レベル 0〜11 動的な圧縮は 4〜6。11 は静的ファイルを事前圧縮するとき向け
brotli_types 圧縮する MIME タイプ(text/html は書かなくても対象) 画像・動画・PDF は入れない
brotli_min_length この長さ(バイト)未満の応答は圧縮しない 小さすぎる応答は圧縮しても縮まない
brotli_static index.html.br のような事前圧縮ファイルがあればそれを返す on。always は Accept-Encoding を見ずに返すので通常は使わない

Brotli と gzip の両方が有効なとき、Accept-Encoding: br を送ってきたクライアントには Brotli が、gzip だけのクライアントには gzip が使われます。gzip を止める必要はありません。

手順 4: 反映して確認する

sudo nginx -t
sudo systemctl reload nginx

# Brotli を受け付けると伝えて確認
curl -sI -H "Accept-Encoding: br" https://example.com/ | grep -i content-encoding
# → content-encoding: br

# gzip だけのクライアントの確認
curl -sI -H "Accept-Encoding: gzip" https://example.com/ | grep -i content-encoding
# → content-encoding: gzip

# CSS など静的ファイルも対象になっているか
curl -sI -H "Accept-Encoding: br" https://example.com/wp-includes/css/dist/block-library/style.min.css | grep -i -E "content-encoding|content-type"

ブラウザーでは開発者ツールの「ネットワーク」で、応答ヘッダーの content-encoding を見れば分かります。br にならないときは、次の順に確認します。

  1. URL が HTTPS か(HTTP では主要ブラウザーが br を送りません。curl で br が返るのにブラウザーで gzip ならこれです)。
  2. nginx -V にモジュールが出ているか、load_module が events より前にあるか。
  3. 対象の Content-Type が brotli_types に入っているか(text/html 以外は列挙が必要です)。
  4. 応答が brotli_min_length より小さくないか。
  5. 前段に CDN やリバースプロキシがあり、そちらが圧縮を決めていないか(次の節)。

WordPress で使うときの注意

キャッシュプラグインが作る静的ファイル

WP Super Cache や W3 Total Cache のように、ページを静的な HTML ファイルとして保存するプラグインを使っている場合、その HTML を返すのは PHP ではなく Nginx です。brotli on が効いていれば、こうした静的ファイルもその場で圧縮されます。プラグイン側の「gzip 圧縮」の設定で .gz を作っている場合は、Nginx の gzip_static と組み合わせる設定になっているので、Brotli に置き換えるなら brotli_static 用の .br を別に作る必要があります。自動で .br を作る仕組みはプラグインによって異なるため、無理に事前圧縮にせず、brotli on の動的圧縮だけで運用する方が簡単です。

テーマやプラグインの JavaScript・CSS

wp-content と wp-includes 配下の CSS・JavaScript は、brotli_types に text/css と application/javascript が入っていれば対象になります。ビルド時に .br を生成しているテーマであれば brotli_static on でそのファイルが使われます。

Cloudflare などの CDN を使っている場合

閲覧者と CDN の間の圧縮は、CDN 側の設定で決まります。Cloudflare の場合、閲覧者への Brotli 圧縮は Cloudflare のダッシュボードの設定(Speed の項目)で切り替えます。Nginx 側の設定は Cloudflare とオリジンサーバーの間の転送に関係します。したがって、Cloudflare を通しているサイトでブラウザーの応答が br になっていても、Nginx の設定が効いているとは限りません。オリジンの設定を確かめるときは、Cloudflare を経由しない接続(curl --resolve example.com:443:オリジンのIP ...)で確認します。

効果の見方

圧縮の効果は、転送量(開発者ツールの「サイズ」列の転送サイズ)で見ます。表示速度への影響を測るなら、PageSpeed Insights の「テキスト圧縮の有効化」の指摘が消えるかどうかと、LCP の変化を見てください。WordPress の表示速度を上げる基本設定に、計測から順に見直す流れをまとめています。

よくある質問

Nginx の Brotli と gzip はどちらを使うべきですか

両方を有効にします。Brotli に対応したクライアント(主要ブラウザーの HTTPS 接続)には Brotli が、それ以外には gzip が使われます。gzip を止めると、古い環境や一部のツールで圧縮なしになります。

brotli_comp_level はいくつにすればよいですか

その場で圧縮する動的なページには 4〜6 が一般的です。11 は圧縮に時間がかかるため、ビルド時にあらかじめ .br を作って brotli_static で返す用途に向いています。CPU の使用率を見ながら決めてください。

WordPress のプラグインで Brotli を有効にできますか

Brotli の圧縮は Web サーバー(Nginx)か CDN が行うため、WordPress のプラグインだけでは有効にできません。共用レンタルサーバーで Nginx の設定を触れない場合は、サーバー会社の管理画面に圧縮の設定があるか、または Cloudflare のような CDN を前段に置く方法になります。

curl では br が返るのにブラウザーでは gzip になります

サイトを HTTP で開いていないか確認してください。主要ブラウザーは HTTPS 接続でしか Accept-Encoding: br を送りません。HTTPS でも gzip になる場合は、前段の CDN やプロキシが圧縮を決めていないかを確認します。

「module is not binary compatible」で Nginx が起動しません

ビルドに使った Nginx のソースの版が、動いている Nginx の版と違うときに出ます。nginx -v の版と同じソースで、--with-compat を付けてビルドし直してください。

まとめ

  • Nginx の Brotli は、ngx_brotli モジュールを入れて brotli on; と brotli_types を設定し、curl -H "Accept-Encoding: br" で content-encoding: br を確認すれば完了です。
  • gzip は併用し、HTTPS でないと使われない点と、text/html 以外は brotli_types に列挙が必要な点に注意します。
  • WordPress で CDN を使っている場合、閲覧者への圧縮は CDN 側の設定で決まります。

関連記事

参考: ngx_brotli(GitHub)、Nginx の ngx_http_gzip_module ドキュメント、Nginx 動的モジュールの読み込み(load_module)

更新履歴: 2026-11-09 全面改訂(モジュール導入・設定・確認・WordPress での注意点を追加)。この記事はワードプレス博士(ライトセンド株式会社)が運営しています。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲