ブログに戻る

フォロー&ご登録

Web パフォーマンスの最適化 : Fastly のインテリジェント圧縮のデフォルト設定を解説

Stephen Stierer

北米プリセールス担当シニアディレクター

Anjan Srinivas

Vice President of Network Products

今日の急速に進化するデジタル環境では、遅いWebサイトは敗北を意味します。これはユーザーの不満だけの問題ではなく、検索エンジンのランキング、そして最終的には収益にも影響を及ぼします。

もし、サイトの速度を劇的に向上させ、同時にコストを削減できるシンプルでありながら強力な方法があったらどうでしょうか?

秘密はコンテンツの圧縮にあります。見落とされがちな最適化ですが、ペイロードサイズを最大 70% 削減できます。Brotliやgzipのようなアルゴリズムを使用することで、コンテンツをより迅速に配信し、帯域の使用を削減し、ユーザーにスムーズでスピーディーな体験を提供できます。サイトのデザインを一行も変更することなく、すべてを実現できます。

Fastly では、顧客のWebサイトの高速化に注力しており、コンテンツの圧縮はこの取り組みの要となっています。実際、当社は10年以上にわたり最先端技術の開発に取り組んでいます。

この投稿では、 Fastlyのデフォルトの圧縮設定について詳しく説明し、HTTP アーカイブからの最近のデータに基づいてその有効性をレビューし、顧客により良いエクスペリエンスを提供するためにこのデータをどのように使用するかについて説明します。

Fastlyが圧縮でコンテンツを強化する方法

Fastly は、圧縮されたレスポンスを効率的にキャッシュするためにリクエストを自動的に最適化し、パフォーマンスを大幅に向上させます。データエッジで 2 つの主要な圧縮アルゴリズム、 Gzip と Brotli をサポートしています。

Fastly は、いくつかの重要な方法でコンテンツの圧縮を処理します。

  • オリジンでの圧縮: オリジンサーバーがすでに圧縮され、Accept-EncodingVary ヘッダー で正しく設定されたコンテンツを配信する場合、Fastly はこれらの圧縮されたレスポンスがサポートするクライアントにのみ配信され、可能な限りキャッシュから再利用されることを保証します。

  • エッジでの圧縮: Fastly は、プラットフォームのエッジで直接データを圧縮することもできます。

  • 静的圧縮:静的圧縮は、Fastlyがオリジンサーバーからレスポンスを受信した後にキャッシュする際に発生します。これはキャッシュ可能なコンテンツに対して非常に効率的です。Fastlyは、圧縮されていないレスポンスを受け取り、エッジで圧縮し、将来のリクエストのために圧縮されたオブジェクトを保存します。

静的圧縮は、VCL ServiceGzipまたはBrotliを使用して利用可能です。圧縮されたオブジェクトは小さい形式でキャッシュされ、配信されるため、課金はクライアントに配信される圧縮サイズに基づいて行われます。これにより、全体的な パフォーマンス が向上しながら、帯域幅のコストが削減されます。

  • 動的圧縮:これは、レスポンスがクライアントに配信される直前キャッシュ後に発生します。静的圧縮が不可能な場合、かつEdge Side Includesと互換性がある場合に理想的です。動的に圧縮されたレスポンスは、圧縮が行われる前の圧縮されていないサイズに基づいて課金されます。

  • Accept-Encoding の最適化: クライアントから送信された Accept-Encoding ヘッダー値を Fastly で正規化します。このヘッダーの多くのバリエーションは意味的に同等です(たとえば、gzipbrgzipbrdeflate)。このヘッダーを正規化することで、Fastlyは キャッシュキーの組み合わせの数を減らし、ブラウザから送信される Accept-Encoding の値が多少異なっていても、キャッシュされた1つの圧縮レスポンスをより多くのユーザーで再利用できるようにします。その結果、キャッシュ効率が向上し、エンドユーザーにとってレスポンス時間が短縮されます。

Fastlyのデフォルト圧縮設定:詳細

Fastly にオンボードすると、特定の圧縮設定がデフォルトで有効になります。これらのデフォルトにより、オリジンサーバーから非圧縮で届いた場合にFastlyが自動的に圧縮するコンテンツタイプとファイル拡張子が決まります。

Fastlyのデフォルトの圧縮可能なコンテンツタイプには以下が含まれます:

text/html|application/x-javascript|text/css|application/javascript|text/javascript|application/json|application/vnd\.ms-fontobject|application/x-font-opentype|application/x-font-truetype|application/x-font-ttf|application/xml|font/eot|font/opentype|font/otf|image/svg\+xml|image/vnd\.microsoft\.icon|text/plain|text/xml

デフォルトの圧縮可能な拡張子は次のとおりです。

"\.(?:css|js|html|eot|ico|otf|ttf|json|svg)(?:$|\?)"

これらのデフォルトは現実世界ではどのように機能するのでしょうか?

この質問に答えるために、 HTTP アーカイブを利用します。これは、 Google の CrUX データセットにある約 1,500 万の URL の WebPageTest 結果を毎月収集するデータセットです。

2025年7月のデータセットでは、この分析には全体で250億件という驚異的なリクエストが含まれていました。この豊富なデータセットにより、リクエストURL、ファイル拡張子、Content-Type / Content-Encoding レスポンスヘッダーを詳細に調査し、圧縮効果を評価することができました。

この研究は、 HTTP Archive を活用して FastlyのGzip設定を洗練・最適化し、10年以上にわたるスマート圧縮によるWeb パフォーマンス向上の追求を継続した Steve Souders(2014年) の基礎研究に基づいています。

FastlyのHTTP Archiveデータの評価によると、Fastlyのデフォルト設定で圧縮可能と分類されているファイル拡張子の大部分は、実際には高い割合で圧縮形式で配信されています。このように、設定と観測された行動が一致していることから、Fastlyのデフォルトは、圧縮可能なコンテンツの転送サイズを最適化するのに一般的に効果的であることが示唆されます。

特筆すべき例外は.ico拡張子であり、比較的低い圧縮率を示しています。さらに調査すると、この拡張子を持つリソースの大部分が image/png コンテンツタイプで提供されていることが判明しました。PNGはすでにロスレス圧縮形式であるため、HTTP圧縮を追加しても得られるメリットはごくわずかです。これが採用率が低い理由と考えられます。以下の表は、.icoレスポンスに関連して最も頻繁に観察されるコンテンツタイプの詳細を示しています。

Fastly のデフォルトの圧縮可能リストに含まれていない拡張子を持つリソースは、Content-Type ヘッダーの一致により、かなりの割合が圧縮されたまま提供されました。例えば、.php であっても、ほとんどの.phpでは、デフォルトリストには拡張機能がありませんデータセット内のレスポンスは、application/javascripttext/cssapplication/json、およびtext/htmlといったコンテンツタイプに関連付けられており、これらはすべてFastlyのデフォルト圧縮ルールに該当します。デフォルトリストに対応する拡張子がない圧縮可能なコンテンツタイプとして頻繁に観察されたのは、text/vttとtext/markdownだけでした。以下の表は、Fastlyの顧客が配信する最も一般的なコンテンツタイプをまとめ、それらがデフォルトの圧縮ルールに一致するかどうかを示しています。

圧縮設定の強化:サイトの高速化、コスト削減

Fastlyのデフォルトの圧縮設定はすでに非常に効果的でしたが、HTTP Archiveのデータを分析したところ、段階的に改善できる可能性があることが判明しました。これらの調査結果に基づいて、デフォルトの圧縮ルールを拡張し、カバレッジと効率をさらに高めました。

デフォルトに追加された拡張機能

  • jsonp

  • txt

  • vtt

デフォルトに追加されたコンテンツタイプ

  • text/*(すべてのテキストベース形式のワイルドカード)

  • application/*json(すべてのJSONベースのアプリケーションタイプに対するワイルドカード)

  • application/*xml(すべてのXMLベースのアプリケーションタイプに対するワイルドカード)

これらの追加により、Fastlyはさらに幅広い関連コンテンツを自動的に圧縮し、ペイロードサイズをさらに縮小します。コードを一行も変更することなく、サイトのパフォーマンスが向上し、配信コストが削減されるという二重の利点があります。

そして、私たちはそこで止まりません。当社のエンジニアリングチームは、ZstandardCompression Dictionary Transportなどの新興圧縮技術を積極的に監視・評価し、速度と効率のさらなる向上を実現できる分野を特定しています。Web が進化するにつれて、 Fastlyのインテリジェントな圧縮のデフォルトも進化し、顧客はWeb パフォーマンスの最前線にいることができます。

Fastlyのインテリジェントな圧縮がパフォーマンス指標にどのような影響を与えるか興味がありますか?アカウントチームにご連絡いただくか、お問い合わせください。詳細をご説明します。

サポートデータセット

圧縮統計を抽出するために使用される BigQuery SQL を以下に示します。この書き込みを実行すると、約2TBのデータが処理されます(この書き込みは無料プランを超える場合があります)。

処理量を減らし、関連するクエリコストを削減するには、「is_root_page」および「rank」のフィルター句のコメントを解除して、データセットをさらに制限することができます。

WITH request_data AS (
 SELECT
   rank, page, url,
   JSON_VALUE(payload._contentEncoding) AS encoding,
   JSON_VALUE(summary._cdn_provider) AS cdn,
   header_name.value AS content_type,
   JSON_VALUE(summary.ext) AS ext,
   JSON_VALUE(summary.type) AS type,
   JSON_VALUE(summary.respBodySize) AS size,
 FROM `httparchive.crawl.requests` ,
   UNNEST (response_headers) AS header_name
 WHERE
   date = "2025-07-01"
   --AND is_root_page = true
   --AND rank <= 1000000
   AND client= "mobile"
   AND header_name.name = "content-type"
)
SELECT
 ext,
 content_type,
 COUNTIF(encoding IN ('gzip', 'br')) AS compressed,
 COUNTIF(ext IN ('css','js','html','eot','ico','otf', 'ttf', 'json', 'svg')) AS fastly_extension_defaults,
 COUNTIF(REGEXP_CONTAINS(content_type,
'(text/html|application/x-javascript|text/css|application/javascript|text/javascript|application/json|application/vnd.ms-fontobject|application/x-font-opentype|application/x-font-truetype|application/x-font-ttf|application/xml|font/eot|font/opentype|font/otf|image/svg\\+xml|image/vnd.microsoft.icon|text/plain|text/xml)')
) AS fastly_content_types_defaults,

 COUNTIF(ext IN ('css','js','html','eot','ico','otf', 'ttf', 'json', 'svg') OR REGEXP_CONTAINS(content_type,
'(text/html|application/x-javascript|text/css|application/javascript|text/javascript|application/json|application/vnd.ms-fontobject|application/x-font-opentype|application/x-font-truetype|application/x-font-ttf|application/xml|font/eot|font/opentype|font/otf|image/svg\\+xml|image/vnd.microsoft.icon|text/plain|text/xml)')) AS fastly_default_compressible,
 COUNT(*) AS requests,
 COUNTIF(encoding IN ('gzip', 'br')) / COUNT(*) AS pct_compressed
FROM request_data
--WHERE cdn = "Fastly"
GROUP BY 1,2
HAVING COUNT(*) > 1000
ORDER BY 3 DESC