圧縮(Gzip、Brotli、Zstd)

HTTPテキスト圧縮の仕組みを、GzipとBrotliとZstdの違い、Googlebotが実際に対応する方式、Core Web Vitalsとクローラーの取得上限への影響、サーバー別の有効化・検証方法まで解説します。ネットワーク上のバイト数を減らすウェブパフォーマンス詳説です。

初回公開:2026年7月3日 · 最終更新:2026年8月22日 · Advanced
言語

圧縮(HTTPコンテンツエンコーディング)は、HTML、CSS、JavaScript、JSON、SVG、XMLサイトマップなどのテキストレスポンスをネットワークへ送る前に小さくします。クライアントはAccept-Encodingで対応方式を示し、サーバーはContent-Encodingで選択を返します。方式で変わるキャッシュ可能レスポンスにはVary: Accept-Encodingが必要です。Brotliは同じテキストで通常Gzipより小さく、対応時はGoogleが推奨しますが、削減率は内容・バージョン・レベルで変わります。Gzipは普遍的なフォールバック、Zstdは登録済みですが普遍的ではなく、Googlebotの対応は公式クローラー文書に記載されていません。Googlebotはgzip、deflate、Brotli(br)に対応します。圧縮はランキング要因ではなく、実際のボトルネックがある場合に転送サイズ、TTFB、LCP、取得上限内への収まりを助けます。MIMEタイプと測定結果で対象を決め、静的アセットは高いレベル、動的レスポンスは低〜中程度のレベルをベンチマークしてください。BREACHのリスクは秘密と攻撃者が反映した内容を混ぜるレスポンスに限られ、サイト全体で圧縮を無効にする理由ではありません。サイトマッププロトコルはgzip圧縮サイトマップを明示的に許可しています。

TL;DR — 圧縮はHTTPのコンテンツエンコーディングのネゴシエーションです。クライアントはAccept-Encodingqの重みやidentityを含められます)を送り、サーバーはリクエストとリソースごとにContent-Encodingを返します。コーディングで変わるキャッシュ可能なレスポンスにはVary: Accept-Encodingが必要です。Brotliは同じテキストで通常Gzipを上回り(15–20%小さいとよく言われますが、内容・バージョン・レベルによります)、対応時はGoogleが推奨しています。Gzipは普遍的なフォールバック、Zstdは登録済みですが普遍的ではない方式です。Googleのクローラー文書はGooglebotのZstd対応を述べていません。Googlebotはgzip、deflate、Brotli(br)に対応します。圧縮はランキング要因でも、TTFB/LCPや検索改善を保証するものでもありません。転送サイズを減らし、実際のボトルネックならTTFB → LCPを助け、Googleの取得上限(2026年の「Inside Googlebot」によるHTML 2 MB)以内にページを収める助けになります。MIMEタイプと測定結果で圧縮対象を決め、拡張子で一括除外しません。BREACHのリスクは秘密と攻撃者が反映した内容を混ぜるレスポンスに限られ、サイト全体で圧縮を無効にする理由ではありません。静的/事前圧縮アセットは高いレベル、動的コンテンツは低〜中程度のレベルを使い、自分のトラフィックとCPUで検証します。サイトマッププロトコルはgzip圧縮サイトマップを明示的に許可しています。

Evidence for this claim HTTP content coding compresses transferred representations and is negotiated with Accept-Encoding and Content-Encoding. Scope: Current official or standards documentation. Confidence: high · Verified: MDN: HTTP compression Evidence for this claim Brotli is an HTTP content coding supported through the br encoding token. Scope: Current official or standards documentation. Confidence: high · Verified: RFC 7932: Brotli

圧縮の正確な意味

圧縮、正確にはHTTPコンテンツエンコーディングは、テキストレスポンスの本文をネットワークへ送る前に小さくし、クライアントが少ないバイトを受け取ってローカルで展開できるようにします。リクエストごとにネゴシエーションされます。GoogleのLighthouse文書が説明するように、ブラウザーは対応する方式をAccept-Encodingリクエストヘッダーで示します。典型的なヘッダーはAccept-Encoding: gzip, deflate, brです。サーバーは1つを選び、レスポンスのContent-Encodingヘッダーで選択を示します。 “When a browser requests a resource, it will use the Accept-Encoding HTTP request header to indicate what compression algorithms it supports.” (翻訳)「ブラウザーがリソースを要求すると、対応する圧縮アルゴリズムをAccept-Encodingリクエストヘッダーで示します。」

HTTP仕様(RFC 9110)に沿って、2つの境界を正確に分けます。コンテンツコーディングはレスポンス本文である表現データの変換であり、接続上を移動するメッセージに作用する転送コーディングとは異なります。このページの圧縮はContent-Encodingで示すコンテンツコーディングです。Accept-Encodingは単純な一覧ではなく、受け入れ可能な方式の優先順位をq値で示し、q=0で拒否も表せます。identityは「コーディングなし」を意味します。ネゴシエーションした方式で本文が変わるキャッシュ可能なレスポンス(同じURLのgzip版とBrotli版など)にはVary: Accept-Encodingが必要です。(mod_deflate)(Vary

対象はHTML、CSS、JavaScript、JSON、SVG、XML(サイトマップを含む)などのテキストです。GzipとBrotliは大幅に小さくでき、GoogleのPageSpeed指針は「gzip圧縮で転送レスポンスを最大90%削減できる」とする上限を示しています。これは上限であり標準値ではありません。実際の削減量は冗長性、サイズ、既存のミニファイ、方式・辞書のバージョン、圧縮レベルに依存します。 “Enabling gzip compression can reduce the size of the transferred response by up to 90%.” (翻訳)「gzip圧縮を有効にすると、転送レスポンスのサイズを最大90%削減できます。」

圧縮と混同してはいけないものが2つあります。

  • ミニファイではありません。 ミニファイはソースから文字(空白やコメント)を除き、圧縮はそのバイトを転送用に再エンコードします。まずミニファイし、次に圧縮します。
  • キャッシュではありません。 圧縮は転送中のバイトを小さくするエンコーディング、キャッシュはCache-ControlETag、CDNによる保存と再利用です。両者は補完関係にあります。保存側はキャッシュを参照します。

このページはクリティカルレンダリングパスハブ配下の圧縮の詳しい解説です。ハブは広いクリティカルバイトのチェックリストで「テキストを圧縮する」を挙げています。このページでその項目を詳しく扱います。

GzipとBrotliとZstd

圧縮率

Brotliは一般にテキストで優れますが、特定の数値を普遍的なものとして扱いません。 GoogleのLighthouse文書は監査の削減量をGzipで計算し、Brotliならさらに削減できると明記しています。web.devのBrotli codelabには、非圧縮で225 KBだったmain.bundle.jsがGzipで約61,6 KB、Brotliで約53,1 KBになった例があります。そのファイルではBrotliが約14%小さくなりましたが、方向性を示すだけで保証ではありません。方式・ライブラリのバージョン、選んだレベル、内容の冗長性、既にミニファイ済みかで差が変わります。圧縮対象をベンチマークし、他サイトの割合をそのまま使いません。 “if Brotli is used, even more savings are possible.” (翻訳)「Brotliを使えば、さらに削減できる可能性があります。」 関連資料

Gzipは普遍的なフォールバックです。 どこでも対応しているため、Googleは安全網として推奨しています。主要ブラウザーはGzipに対応しますが、Brotliより効率が低いという位置付けです。 “Use GZIP as a fallback to Brotli. GZIP is supported in all major browsers, but is less efficient than Brotli.” (翻訳)「BrotliのフォールバックとしてGZIPを使います。GZIPは主要なブラウザーすべてでサポートされますが、Brotliより効率が低い方式です。」

Zstdは登録された第3の方式ですが、安全な既定値ではありません。 IANAのHTTPコンテンツコーディング登録簿にはgzipbrzstdがありますが、登録はクライアント、クローラー、オリジン、CDNの普遍的な対応を意味しません。リクエストが求めた方式だけを広告し、フォールバックを残します。HTTP相互運用ではRFC 9659がzstdデコーダーに最大8 MBまでのウィンドウ対応を求め、より大きなウィンドウをエンコーダーが要求することを禁じています。zstdと辞書方式のdczも別物です。Caddyなどには実装がありますが、Googleの現行クローラー文書はgzip、deflate、Brotliを列挙し、GooglebotのZstandard対応を述べていません。Zstdは対応するスタックとリクエストで有効にする候補として扱い、まだGzip/Brotliの置き換えにはしません。 Evidence for this claim gzip, br and zstd are registered HTTP content codings, but registration is not universal client, crawler, origin or CDN support; deploy only a coding advertised for the individual request and preserve a valid identity or fallback path. For HTTP interoperability, RFC 9659 requires zstd decoders to support windows through 8 MB and encoders not to require larger windows; this `zstd` coding is distinct from dictionary coding `dcz`. Scope: registry Confidence: high · Verified: HTTP Content Coding Registry encode zstd gzip

ブラウザーとクローラーの対応

現在のブラウザーではBrotli対応がほぼ普遍的ですが、常にそうだったわけではありません。GoogleのLighthouse文書は、2022年12月時点でiOSのSafariを除く主要ブラウザーが対応していたと記しています。この差が、Gzipフォールバックを残す理由です。 “As of December 2022 Brotli is supported in all major browsers except Safari on iOS.” (翻訳)「2022年12月時点では、iOSのSafariを除く主要ブラウザーすべてがBrotliをサポートしています。」

Googleは、クライアントがBrotliを受け取れる場合はBrotliを使うよう推奨しています。Brotliは他の方式よりリソースのファイルサイズを小さくできるためです。 “If the browser supports Brotli (br) you should use Brotli because it can reduce the file size of the resources more than the other compression algorithms.” (翻訳)「ブラウザーがBrotli(br)に対応しているなら、他の圧縮アルゴリズムよりリソースのファイルサイズを削減できるため、Brotliを使うべきです。」

Gzipへフォールバックし続ける場合

BrotliとともにGzipを常に設定します。コンテンツエンコーディングはリクエストごとに交渉されるため、正しく設定したサーバーはbrを広告するクライアントにはBrotliを、それ以外にはGzipを自動的に提供します。どちらか1つを選ぶのではなく、両方を提供してハンドシェイクに任せます。

Google(とBing)はBrotliとGzipに対応するか

多くの圧縮記事が根拠なしに断言する問いです。ここではGoogle自身の発言を、日付のある3段階の流れで確認します。

2008年の「Googlebotとの最初のデート」記事

Googleは2008年から自らの声で圧縮を説明しています。Maile OhyeとJeremy LilleyのGooglebotとの最初のデート:ヘッダーと圧縮 は、主要な検索エンジンとウェブブラウザーが帯域を節約するためGzipに対応し、x-gzip(Gzipと同じ)、deflate(Googleも対応)、identity(なし)も見かけると説明します。同じ記事は、Flash、JPG、PNG、GIF、PDFなど多くの形式がすでに圧縮されており、再圧縮の利得が小さいことも説明しています。古い「outdated」表示のある記事ですが本文は公開され、現在の話題に直接関係します。

2008年の記事は引用符や深いリンクなしでここに示します。ブリーフでは、直接取得によって該当行を正確な部分文字列として検証しましたが、旧テンプレート用の#:~:text=リンクは作成していないため、逐語引用ではなく要約します。

Gary Illyesによる2020年のBrotli確認

GooglebotのBrotli対応は公式文書に載る前に非公式に確認されました。2020年8月、GoogleのGary IllyesはGooglebotチームとの面会後、数週間前にGooglebotがBrotli圧縮に対応するか尋ねられ、対応すると述べました。Barry Schwartzが同日にSearch Engine Roundtable で報じています。これは現行のクローラー概要文書より約4年前で、担当者の確認が文書化に先行することを示します。

現行の公式クローラー文書

現在は明確に記載されています。GoogleのCrawler (User Agent) Overview は、Googleのクローラーとフェッチャーがgzip、deflate、Brotli(br)をサポートすると述べます。各Googleユーザーエージェントが対応するエンコーディングは各リクエストのAccept-Encodingヘッダーで広告され、例はAccept-Encoding: gzip, deflate, brです。私のAhrefsGooglebotガイド にも、Googlebotがgzip、deflate、Brotli(br)に対応すると記載しています。 “Google’s crawlers and fetchers support the following content encodings (compressions): gzip, deflate, and Brotli (br).” (翻訳)「Googleのクローラーとフェッチャーは、gzip、deflate、Brotli(br)をサポートします。」 “The content encodings supported by each Google user agent is advertised in the Accept-Encoding header of each request they make. For example, Accept-Encoding: gzip, deflate, br.” (翻訳)「各Googleユーザーエージェントが対応するコンテンツエンコーディングは、各リクエストのAccept-Encodingヘッダーで示されます。例:Accept-Encoding: gzip, deflate, br。」 “Googlebot supports gzip, deflate, and Brotli (br).” (翻訳)「Googlebotはgzip、deflate、Brotli(br)をサポートします。」

したがって系譜は、2008年のブログ記事 → 2020年のIllyes確認 → 現行のクローラー文書です。これは確立した情報であり、推測ではありません。

Bingの文書上の空白

ここでBingには正直な注記が必要です。通常のHTMLクロールでBingbotがどのコンテンツエンコーディングを交渉するかを示す詳細な公開文書はなく、Googleのクローラー概要ページに相当するものもありません。Bingが文書化している範囲は狭く、Content Submission APIがGzipに対応し、gzip圧縮サイトマップ.xml.gz)を送信できます。HTTP圧縮は現代のクライアントがAccept-Encodingで交渉する標準機構なので、Bingbotが少なくともGzipを扱うと推測するのは合理的ですが、Bingの文書化された声明ではなくHTTPの仕組みからの推論として扱います。これは2つの検索エンジンの文書透明性の差であり、Bingbotの実際の挙動への批判ではありません。

圧縮がパフォーマンスとCore Web Vitalsに重要な理由

因果関係を正確に述べる

圧縮は直接のランキング要因ではありません。圧縮が作用する仕組みは、転送サイズが小さくなればダウンロード時間が短くなり、Time to First Byteと、その後のLargest Contentful Paintを助け、それらがCore Web Vitalsに含まれるというものです。ただし「助ける可能性がある」に留まります。データベースクエリ、レンダーブロッキングスクリプト、DNS/接続設定など別の箇所がボトルネックなら、すでに小さいレスポンスを圧縮しても改善しません。自分のボトルネックと実環境の結果を測定します。評価されるのは圧縮設定ではなく速度の結果です。関連項目はTime to First ByteLargest Contentful PaintCore Web Vitalsです。

Evidence for this claim Reducing transferred bytes may improve a network-bound load, but compression alone does not guarantee lower TTFB/LCP, better Core Web Vitals or a Search change; measure the actual bottleneck and field outcome. Scope: lab audit Confidence: high · Verified: Enable text compression

GoogleのMartin Splittによる、未圧縮のページ重量で考えると誤解しやすいという説明があります。重要なのはディスク上の未圧縮サイズではなく、圧縮後に実際にネットワークを通る量です。未圧縮で10 MBに見えるページがネットワーク上では5〜6 MBになることもあります。このSplittの説明は一次記録ではなくSearch Engine Journalの報道を介したものなので、ここでは引用せず要約しています。

圧縮とクロール効率 — 過小評価される側面

圧縮は人間向けのページ速度だけではありません。Googleの取得上限以内に収める助けにもなります。2026年の「Inside Googlebot」更新(Gary Illyes)では、GooglebotがHTMLをURLあたりおよそ2 MB取得するとされ、旧来の15 MBから減っています。上限を超えた内容は拒否ではなく切り捨てられ、取得部分だけがインデックスへ渡されます。HTMLを圧縮することは重要な内容を予算内に残す手段であり、Core Web Vitalsだけでなくクロール効率の問題です。クロールも参照してください。

Lighthouse「テキスト圧縮を有効にする」監査 — 正確な閾値という指示です。」

PageSpeed Insights/Lighthouseの**「テキスト圧縮を有効にする」**監査には明確な発火条件があります。brgzipdeflatecontent-encodingを持たないテキストレスポンスを集め、Gzipで圧縮して削減量を推定します。Googleの文書によると、元のレスポンスが1,4 KiB未満、または圧縮による削減可能量が元サイズの10%未満なら、Lighthouseは結果でフラグを立てません。したがって約1,4 KiB未満の小さなファイルは、未圧縮でも警告対象になりません。 “Enable text compression” (翻訳)「「テキスト圧縮を有効にする」という指示です。」 “If the original size of a response is less than 1.4KiB, or if the potential compression savings is less than 10% of the original size, then Lighthouse does not flag that response in the results.” (翻訳)「レスポンスの元サイズが1.4KiB未満、または圧縮による削減可能量が元サイズの10%未満なら、Lighthouseは結果でそのレスポンスにフラグを立てません。」 “Document request latency” (翻訳)「ドキュメントリクエストのレイテンシ。」

正しく設定したサイトでも監査に失敗できる理由

GoogleのPageSpeed文書には、プロキシサーバーやウイルス対策ソフトがクライアントへのダウンロード時に圧縮を無効にできるとあります。圧縮チェッカーが「圧縮が有効でない」と報告しても、途中の機器がContent-Encodingヘッダーを除去した誤検知かもしれません。レポートやサーバーを疑う前に、クリーンなネットワーク経路からテストします。 “Proxy servers and anti-virus software can disable compression when files are downloaded to a client machine.” (翻訳)「プロキシサーバーやウイルス対策ソフトは、ファイルをクライアントへダウンロードするとき圧縮を無効にできます。」 “compression isn’t enabled” (翻訳)「圧縮が有効になっていません。」

静的圧縮と動的圧縮 — 実装上のトレードオフ

圧縮レベル

どちらの方式にも、CPU時間と圧縮率を交換する調整可能なレベルがあります。

  • Gzip: レベル1–9。
  • Brotli: レベル0(圧縮なし)から11(最大)まで。

高いレベルほど強く圧縮しますが、CPU時間を多く消費します。

CPUコスト — 静的と動的を分ける理由

圧縮は無料ではなくCPUを消費します。事前に構築したアセットとオンザフライで生成するコンテンツではコストの形が大きく異なります。正しい設定はどちらにも共通する1つの数字ではなく、内容の変更頻度、キャッシュ/CDNの圧縮バリアントの扱い、トラフィック量、実測値で決まります。

  • 静的(事前圧縮/ビルド時)アセット — 安定した内容を事前に一度圧縮できます。nginxのgzip_staticやApacheのmod_deflateは、リクエストごとに再圧縮せず事前圧縮ファイルを選べます。CPUコストをビルド時に一度だけ払うので高いレベルを使えます。
  • 動的(リクエストごとに生成)レスポンス — 最大レベルをリアルタイムで使うと全レスポンスに遅延が加わるため、低〜中程度から始めます(動的コンテンツではBrotli品質4程度が速度と率の出発点になることがあります)。ただし固定ルールではなく、自分のCPU余力とトラフィックでベンチマークします。

実務上の出発点は、静的なら高く、動的なら低〜中程度です。ただし自分の変更頻度、キャッシュ/CDNの挙動、トラフィック、変更前後の測定で確認し、記事の数字をそのまま使いません。

圧縮を有効にする方法

仕組みはどこでも同じです。サーバー(またはCDN/エッジ)を設定してテキストレスポンスを圧縮し、BrotliをGzipフォールバック付きで広告します。プラットフォーム別の方法は次のとおりです。

  • Apachemod_deflate(Brotliはmod_brotli)。GoogleのPageSpeed指針が直接案内しています。
  • Nginx — 組み込みのngx_http_gzip_modulegzip on;gzip_types)と、br用Brotliモジュール。
  • IIS — 組み込みのHTTP Compression(静的・動的)。
  • CDN/エッジ — Cloudflare、Fastlyなどは通常Brotli+Gzipを切り替えで提供し、Caddyはencode zstd gzipを公開します。
  • アプリフレームワーク — Node/Expressのcompressionミドルウェア。Next.js/Vercelと多くの現代的ホストは既定で圧縮します。

次に検証します。正確なコマンドはChecklistsレンズを参照してください。最速の確認は、curl -I -H "Accept-Encoding: br, gzip" https://example.com/を実行し、レスポンスのcontent-encodingヘッダーを確認することです。

圧縮してはいけないもの

JPG、PNG、GIF、大半の動画、WOFF2フォント、大半のPDFなど、すでに圧縮された形式を再圧縮しません。再びGzipやBrotliをかけると、わずかな、場合によっては負のサイズ変化のためにCPUを使います。これは例であり完全な規則ではありません。安全な一般則はテキスト形式などMIMEタイプで範囲を決め、可能なら特定レスポンスの実測出力を確認することです。 “may not benefit and can grow.” (翻訳)「効果がなく、ファイルが大きくなることもあります。」

圧縮が「対象にならない」普遍的な最小レスポンスサイズもありません。小さい、または密度の高い本文ではフレーミングやメタデータのオーバーヘッドが削減量を消すことがありますが、損益分岐点は方式、実装、レスポンスヘッダー、内容で変わります。Lighthouseの1,4 KiB/10%閾値は特定監査の抑制規則であり、一般的なサイズ下限ではありません。

Evidence for this claim Framing and metadata overhead can erase savings for small or poorly compressible bodies; there is no universal minimum response size because codec, implementation, headers and content determine the break-even point. Scope: lab audit Confidence: high · Verified: Enable text compression

圧縮とBREACH — 範囲を限定したリスクであり、サイト全体を無効にする理由ではない

圧縮を無効にするよう勧めるセキュリティ助言を見かけることがありますが、一般化しません。BREACH型のリスクは圧縮一般の性質ではなく、特定の攻撃形態です。レスポンスが圧縮され、CSRFトークンなどの秘密と攻撃者が操作した反映内容が同じ本文に混ざり、攻撃者が繰り返し圧縮レスポンスの長さを観測して秘密を1バイトずつ推測できる場合に成立します。Apacheのmod_deflate文書もこの組み合わせをBREACH固有のレビュー対象として示します。秘密と攻撃者入力を圧縮本文で組み合わせないなら典型的な攻撃は適用されません。サイト全体のテキスト圧縮を無効にせず、脆弱なレスポンスと文脈を修正します。

Evidence for this claim BREACH-style risk is not a reason to disable compression sitewide: the classic attack requires a compressible HTTP response that combines a secret with attacker-influenced reflection and observable repeated length; mitigate the vulnerable response/context with reviewed controls. Scope: security Confidence: high · Verified: BREACH: Reviving the CRIME Attack

サイトマップの神話 — 圧縮は明示的に許可されている

重要な訂正です。**Sitemapsプロトコルはgzip圧縮サイトマップを明示的に許可しています。**サイトマップをgzip化できない、またはすべきでないという考えは誤りです。sitemaps.orgのプロトコル は帯域を減らすためのgzipサイトマップ(.xml.gz)を認め、両検索エンジンが受け入れ、Bingの送信ツールもgzipに対応します。注意点は、非圧縮サイトマップが50 000 URL/50 MBの上限を守ることだけです。大規模サイトマップを転送時にgzip化するのは問題ありません。

圧縮はウェブパフォーマンスのどこに位置するか

圧縮は関連する施策の1つです。クリティカルレンダリングパスがダウンロードする重要バイトを小さくし、TTFBとその後のLCPを下げ、PageSpeed Insights/Lighthouse監査の対象になります。エンコーディングと保存を分担するキャッシュや、より小さいブロッキングファイルを早く描画させるレンダーブロッキングリソースとも組み合わせます。広いツール群はウェブパフォーマンスツールを参照してください。

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.