Steve Souders - High Performance Web Sites

WebアプリケーションやWebページの高速読み込みを実現するための基本的な方法のひとつに、通信内容をGZIP圧縮するというものがある。最近のブラウザのほとんどがこの機能を実装しており、多くの通信ですでにこの機能が使われている。しかし、ブラウザがこの機能を実装し、サーバに対してもGZIP圧縮の使用を要求しているにもかかわらず、非圧縮の通信が実施されるケースがある。

そうしたケースがどうして発生するのか、そうした場合にもGZIP圧縮の通信を実施するにはどうすればいいのかといった話がVelocity: Forcing Gzip Compression - High Performance Web Sites blogで紹介されている。Velocity 2010で発表があったForcing Gzip Compression (ZIP圧縮のプレゼン資料)の内容を紹介するものだが、原因や対処方法が紹介されており参考になる。

説明によればGoogle検索にやってくる通信のうち15%が、GZIP圧縮通信が可能なブラウザからのものであるにもかかわらず、Accept-Encodingヘッダが指定されていないか適切なものではなく、GZIP圧縮通信が実施されない状況にあるという。GZIP圧縮を実施できると実施できないとでは読み込み時間が3倍ほど違ってくるという。

どうやらこのような状況になるのはホストと検索エンジンの間に入る中間部分で書き換えが実施されているのが原因だという。たとえばプロキシサーバやアンチウィルスソフトウェアによって書き換えが実施されると説明がある。こうした状況を受けGoogle検索チームは強制的にGZIP圧縮通信を実施する方法を模索。最終的に次の方法でGZIP圧縮通信を実施する方法を発見したという。紹介された方法は次のとおり。

  1. Accept-Encodingがなかったり問題がある場合で、モダンブラウザ(IE6+、Firefox 1.5+、Safari 2+、Opera 7+、Chrome)であり、かつ、「GZIP圧縮通信を実施しない」または「GZIP圧縮通信を実施する」というクッキーが設定されていない場合に限り次の処理を実施する。クッキーが設定されている場合にはその設定に従って動作する。
  2. 検索ページの一番下にJavaScriptを追加。
  3. 追加されたJavaScriptは「GZIP圧縮通信を実施しない」ことを意味するクッキーを設定する動作をする。
  4. GoogleからはGZIP圧縮通信でページを送信する。
  5. 送信されるコンテンツにはJavaScriptが入っており、これが「GZIP圧縮通信を実施しない」というクッキー設定を「GZIP圧縮通信を実施する」というクッキー設定への書き換えを実施する。GZIP圧縮通信に対応していないブラウザでは処理できないため、先ほど設定した「GZIP圧縮通信を実施しない」というクッキー設定が残る。

たしかにこの方法であれば、GZIP圧縮通信に対応しているブラウザはクッキーが効いている限り、2回目以降のアクセスではGZIP圧縮通信が実施されることになる。この方法はRFC2616に記載されている内容にも適合するもので問題がない。Google検索ページの平均ページサイズは34KBだというが、GZIP圧縮通信ではこれが10KBまで圧縮されるという。

ここで紹介されている方法はブラウザ側の変更が必要なく、サーバ側の対応だけで実現できるという点で興味深い。Googleのサイトのみならずほかのサイトでもページ読み込み時間を高速化するためのテクニックとして応用できる。