ITに関するさまざまなトピックを紹介するサイトです
このコンテンツはお使いのブラウザには対応しておりません。
新しいバージョンのブラウザでアクセスしてください。

Webコンテンツをgzip圧縮配信する


Webサイトのレスポンス性能を上げることは非常に重要です。 レスポンスが悪ければ、ユーザエクスペリエンスが悪化しますし、現在では検索サイトのランキングの指標として直接影響があります。
レスポンスを改善するためには、多くのことに対応していく必要がありますが、その中の一つとして、Webサーバから配信するコンテンツの通信量を減らすということがあります。
通信量を減らす方法にもいくつもの観点・手段がありますが、Webコンテンツを圧縮して配信するのも一つの方法です。
圧縮されたコンテンツは受け取った側で解凍する必要がありますが、最近ではクライアントとなる端末が十分高性能であるケースが多いので、解凍処理がかえってボトルネックとなる状況はほとんど考慮しなくてよいと思われます。

Webコンテンツを圧縮して配信する方法は、さらに静的方法と動的方法とに分けられます。
静的方法では、事前に圧縮したファイルを用意しておく必要があるので、サイトの規模や圧縮対象ファイルの更新頻度などによっては、運用負荷が高くなってしまいます。
動的に圧縮する方法では、サーバ側の処理負荷が増えます。
サイトの特性などを総合的に考慮して、最適な手段を検討する必要があります。

設定例

ここでは、Apacheで静的にgzip圧縮ファイルを配信する方法を説明します。

.htaccessファイルに、JavaScriptファイルとCSSファイルを対象にgzip圧縮配信する設定例は、以下のようになります。

<IfModule mod_rewrite.c>
	Options +FollowSymLinks
	RewriteEngine On

	RewriteCond %{HTTP:Accept-Encoding} gzip
	RewriteCond %{REQUEST_FILENAME} !\.gz$
	RewriteCond %{REQUEST_FILENAME}\.gz -s
	RewriteCond %{REQUEST_FILENAME} \.js$ [OR]
	RewriteCond %{REQUEST_FILENAME} \.css$
	RewriteRule .+ %{REQUEST_URI}.gz

	<FilesMatch "\.js\.gz$">
		ForceType application/javascript
		AddEncoding x-gzip .gz
	</FilesMatch>

	<FilesMatch "\.css\.gz$">
		ForceType text/css
		AddEncoding x-gzip .gz
	</FilesMatch>
</IfModule>

JavaScriptファイルとCSSファイルは、元のファイルとともに、その同一ディレクトリに事前にgzip圧縮したファイルも配置しておく必要があります。 gzip圧縮したファイルの拡張子は、それぞれ「.js.gz」、「.css.gz」としておきます。

解説

mod_rewrite

リクエストをgzip圧縮ファイルへ書き換えるためにmod_rewriteを利用します。
この設定でリクエストが自動的に書き換わるので、対象のCSSやJavaScriptファイルを指定している箇所を、「.gz」を付加する形式に変更する必要はありません。

RewriteEngineディレクティブ

リライト機能を有効にするために指定します。

リライト条件

RewriteCondディレクティブで、リライトの条件を指定します。
すべてのRewriteCondディレクティブで指定した条件を満たす場合に、リライトルールに従って書き換えが実行されます。
[OR]が指定されている条件は次の条件とのOR条件となります。
条件指定では、「%{変数名}」という形式で、サーバ変数を参照することができます。
「%{HTTP:Accept-Encoding}」は、HTTPクライアントがサポートしている圧縮方式を表すHTTPリクエストヘッダの値です。
「%{REQUEST_FILENAME」は、リクエストにマッチするローカルファイルシステムのパスを表します。
「!」は条件の否定を意味します。
「-s」はサイズ0より大きい通常ファイルが存在するかどうかのチェックを意味します。
条件パターンの指定には、Perl互換の正規表現を使用することができ、「$」は末尾を意味します。

設定例で指定した条件の意味

HTTPクライアントがgzip圧縮方式をサポートしている
かつ
リクエストファイル名の末尾が「.gz」ではない
かつ
リクエストファイル名に「.gz」を付加したファイルが、サイズ0より大きい通常ファイルとして存在する
かつ
リクエストファイル名の末尾が「.js」または「.css」で終わっている
gzip圧縮をサポートしていないクライアントからリクエストが来た場合は、オリジナルのJavaScriptファイル、CSSファイルが配信されます。

リライトルール

RewriteRuleディレクティブで、リライトルールを指定します。
Perl互換の正規表現を使用できるパターンと、リクエストの書き換え後の文字列を指定します。
設定例では、リクエストURIの末尾に「.gz」を付加した形式に書き換えられます。

FilesMatchディレクティブ

正規表現にマッチするファイル名に対して適用したい処理を指定するものです。
ここでは、ファイル名の末尾が「.js.gz」のリクエストに対して、MIMEタイプをJavaScriptに指定するとともに、gz拡張子がx-gzipエンコードであることを設定しています。
CSSファイルに対しても、同様に設定しています。

当サイトでは、第三者配信による広告サービスを利用しています。 このような広告配信事業者は、ユーザーの興味に応じた商品やサービスの広告を表示するため、当サイトや他サイトへのアクセスに関する情報(氏名、住所、メール アドレス、電話番号は含まれません)を使用することがあります。 このプロセスの詳細やこのような情報が広告配信事業者に使用されないようにする方法については、こちらをクリックしてください。