Httpサーバ データ圧縮による高速化(通信量の削減)手法

高速化(通信量の削減)の手法についての簡単なメモ。

大まかな仕組み

なにもしていなければ大体こんな感じでブラウザとサーバでやり取りが行われる。

sequenceDiagram participant 1 as ブラウザ participant 2 as Httpサーバ participant 3 as サーバ内データ<br>index.html 1->>+2: request get<br>index.html 2->>+3: index.htmlを探す 3->>+2: index.htmlのデータ 2->>+1: response<br>index.htmlのデータ

パターン1:Httpサーバでデータを圧縮する

sequenceDiagram participant 1 as ブラウザ participant 2 as Httpサーバ participant 3 as サーバ内データ<br>index.html 1->>+2: request get<br>index.html 2->>+3: index.htmlを探す 3->>+2: index.htmlのデータ 2->>+2: index.htmlのデータを圧縮 Note over 2: サーバで圧縮するので<br>負担があるかも 2->>+1: response<br>Content-Encoding gzip<br>index.htmlのデータ 1->>+1: index.htmlのデータを展開
  • サーバ内のデータに手を加える必要がない。
  • .htaccess などで設定を行うだけで良い場合が多く比較的簡単なので楽。※1
  • サーバで圧縮を行うため処理負担がかかる可能性がある。
  • Httpサーバ自体にデータを圧縮する機能が必要。
  • ブラウザが圧縮形式に対応している必要がある。※1

※1
リクエスト情報からブラウザの圧縮データ対応は分かるので、非対応ブラウザの場合は圧縮せずに(Content-Encodingを付けずに)送信するといった設定も可能。

パターン2:サーバ内に圧縮済みのデータを用意する

sequenceDiagram participant 1 as ブラウザ participant 2 as Httpサーバ participant 3 as サーバ内データ<br>index.html<br>index.html.gz 1->>+2: request get<br>index.html 2->>+3: index.html.gzを探す 3->>+2: index.html.gzのデータ 2->>+1: response<br>Content-Encoding gzip<br>index.htmlのデータ 1->>+1: index.htmlのデータを展開
  • 圧縮済みのデータだけにするとサーバのデータ量が削減できるかも。
  • サーバ自体では圧縮を行う必要が無いため処理負担がかからない。
  • サーバ内のデータに手を加える必要がある。
  • ブラウザが圧縮形式に対応している必要がある。※2
  • .htaccess などで設定する必要があるが結構複雑。 ※2

※2
リクエスト情報でブラウザの圧縮データ対応は分かるので、オリジナルデータ、圧縮データの両方を用意しておき
対応ブラウザの場合は圧縮データを、非対応ブラウザの場合はオリジナルデータを送信するといった設定も可能だが
最初から ".gz" 付のアクセスがあった場合の判定や、Mime設定などを色々行わないといけないので結構面倒。サーバ自体に圧縮機能がない場合はこちらで何とかするしかない。

まとめ

個人的には、高速化したいだけならパターン1の方が断然楽。
パターン2の方は大きなデータを使う場合などにピンポイントで使ってみようと思う。