Apache httpd の mod_deflate でHTTP圧縮通信をサポートしよう

投稿者 : OSCA

[PR] "出川哲朗の充電させてもらえませんか?"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

概要

 サーバーからクライアントへのデータ通信量を減らす方法として、データを圧縮する方法があります。 本稿では Apache httpd の mod_deflate モジュールを利用し、クライアントにコンテンツを圧縮して返却する方法にについて解説します。

圧縮通信の仕組み

 上記の通り、サーバーからクライアントへのデータ通信量を減らす方法として、データを圧縮する方法があります。 特に HTML や CSS, JavaScript などのテキストファイルは、圧縮することにより大幅にデータ量を減らすことができます。 データを圧縮した場合に何が嬉しいかというと、ネットワーク通信量を削減できるということと、それだけ早くコンテンツを取得し終えられるため、ブラウザ側は早くHTMLのレンダリングを開始することができます。

圧縮通信の利点

  • ネットワーク通信量を削減できる。
  • ネットワーク通信が早く終わるため、ブラウザのレンダリング開始を早められる。

 ただし、圧縮通信を行う場合、クライアント(ブラウザ)側とサーバー側が、共通の圧縮アルゴリズムをサポートしている必要があります。 サーバーが一方的にブラウザに圧縮データを送りつけても、データを解凍できないと意味がありませんよね。 また、サーバー側は圧縮処理を、ブラウザ側は解凍処理を行うようになるため処理負荷は高まります。

圧縮通信の懸念点

  • クライアント側とサーバー側で共通した圧縮アルゴリズムをサポートしている必要がある。
  • サーバー側は圧縮、クライアント側は解凍の処理が必要になるため、僅かに処理負荷は高まる。

 クライアント(ブラウザ)側がサポートしている圧縮アルゴリズムは、HTTPリクエストの際に Accept-Encoding ヘッダを付与することでサーバーに伝えることができます。 Accept-Encoding ヘッダの詳細については、別項「HTTPリクエストヘッダ Accept-Encoding とは?」を参考にしてください。 サーバー側は Accept-Encoding ヘッダで教えてもらった圧縮アルゴリズムをサポートしていれば、その圧縮アルゴリズムを利用してコンテンツを圧縮して応答するというわけです。

HTTPリクエストの例

GET /index.html HTTP/1.1
Host: weblabo.oscasierra.net
Accept-Encoding: gzip, deflate, br

フィルター機能

 mod_deflate の説明をする前に、Apache httpd のフィルタ機能についても理解しておく必要があります。 フィルタ機能とは、Apache httpd がコンテンツを返却する際に、コンテンツに加工をするための機能です。 どんな加工をするかはフィルターの特徴によりますが、ここで一番強調したいことは、本稿で述べる圧縮通信もこのフィルタでコンテンツを圧縮するということです。

mod_deflate とは?

 mod_deflate は、Apache httpd からコンテンツを返却する前に DEFLATE という圧縮アルゴリズムでコンテンツを圧縮してくれるフィルターを提供するモジュールです。この DEFLATE フィルタを利用することにより、サーバーからクライアント(ブラウザ)に対するデータ転送量を削減することができます。 DEFLATE 圧縮アルゴリズムの歴史は古く、多くのブラウザが対応しています。

 mod_deflate は Apache httpd をインストールした際に一緒にインストールされている場合がほとんどですので、追加でインストールする必要はないと思います。 mod_deflate を読込む設定になっているかは、Apache httpd の設定ファイル中で次のように LoadModule で読み込まれているかを確認してください。

LoadModule deflate_module modules/mod_deflate.so

設定

 それでは設定方法について解説します。 mod_deflate が有効になっている場合、Apache httpd の設定記述中で DEFLATE という定数のフィルタを利用できるようになります。 次のように AddOutputFilterByType ディレクティブでフィルタ名(DEFLATE)と圧縮するコンテンツのタイプを指定してあげるのが、とてもシンプルな設定です。 次の例では HTML, TEXT, CSS を圧縮して返却するように設定しています。

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/css
</IfModule>

 上述の通り、圧縮する対象はテキストのコンテンツとするのが良いでしょう。 JPEG画像などは既に圧縮されているのであまり効果がありません。 HTML, TEXT, CSS, JavaScript, XML, JSON などのテキストファイルに対して DEFLATE フィルターを適用するのが好ましいでしょう。

おわりに

 本稿では Apache httpd の mod_deflate モジュールを利用し、クライアントにコンテンツを圧縮して返却する方法にについて解説しました。

Apacheのトップへ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。 個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca