【Apache】サイトのコンテンツ全てをgzip圧縮する


Javascriptライブラリをgzip圧縮する」や「YUI CompressorでJavascriptを圧縮する」では、個々のファイルを圧縮して転送量を減らす技を書いた。でも、このように個別に指定するのではなく、透過的に実行してくれる方がありがたい。そのようなときに便利なのがApacheのmod_deflateモジュールだ。

@IT:mod_deflateによるコンテンツの圧縮転送
http://www.atmarkit.co.jp/flinux/rensai/apache2_04/apache04a.html
wadsのblog » Blog Archive » [Apache] mod_deflateでコンテンツをgzip圧縮して通信する
http://wadslab.net/2008/09/mod_deflate/

mod_deflateに関しては上の2つのリンクが詳しいのだが、ちょっと情報が古い。

「圧縮するべきファイルのタイプ」を指定する為に使われている「AddOutputFilterByType」ディレクティブは現在では非推奨になっている。

下で説明される理由により、本ディレクティブは非推奨です。 (中略) AddOutputFilterByTypeディレクティブにより有効にしたフィルタは場合によっては、部分的もしくは完全に適用されないことがあります。例えば、MIMEタイプが決定できないときにはDefaultTypeの設定が同じだったとしても、DefaultType設定を使うようになります。
http://httpd.apache.org/docs/2.2/ja/mod/core.html#addoutputfilterbytype

その代替策として使えるのがmod_filterだ。

Apache 2.2 mod_filterを使いこなす – AddOutputFilterByType DEFLATE text/htmlを書き換えてみる « cyano
http://www.onflow.jp/cyano/archives/137

実際に設定してみる

まずは、必要なモジュールを有効にする。次の2行がhttpd.conf(又はそれにインクルードされるファイル)にあることを確認する。

LoadModule filter_module libexec/apache2/mod_filter.so
LoadModule deflate_module libexec/apache2/mod_deflate.so

後は上のリンクに記されているものを(ほぼ)そのままコピペ。

# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html

# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip

# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

# ここからフィルター設定
FilterDeclare Compression CONTENT_SET
FilterProvider Compression DEFLATE Content-Type $text/plain
FilterProvider Compression DEFLATE Content-Type $text/css
FilterProvider Compression DEFLATE Content-Type $application/xhtml
FilterProvider Compression DEFLATE Content-Type $application/xml
FilterProvider Compression DEFLATE Content-Type $application/xhtml+xml
FilterProvider Compression DEFLATE Content-Type $application/rss+xml
FilterProvider Compression DEFLATE Content-Type $application/atom+xml
FilterProvider Compression DEFLATE Content-Type $application/x-javascript
FilterProvider Compression DEFLATE Content-Type $image/svg+xml
FilterProvider Compression DEFLATE Content-Type $text/html
FilterProvider Compression DEFLATE Content-Type $application/javascript
FilterChain Compression
# ここまでフィルター設定

# Don't append Vary heder for specific files
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|zip|lzh|exe)$ dont-vary

# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
Header append Vary Accept-Encoding env=!dont-vary

1行目~8行目でgzip圧縮に対応していない古いブラウザを除外している。11行目~23行目がフィルター本体。うちの環境ではコピペそのままではうまく動かなかった1のでハイライトした部分を追加した。残り、27行目以降はプロクシサーバへの対応である。

圧縮されているか確認する

手っ取り早く確認するならApacheのaccess_logを見てみよう。例えば、このブログのトップページ「https://blog.delphinus.dev/」のhtmlファイルは84,513Byteある。設定前と設定後でaccess_logに次のような変化が見られるはずだ。

設定前

xx.xx.xx.xx - - [26/Mar/2010:00:00:00 +0900] "GET / HTTP/1.0" 200 84513 "https://blog.delphinus.dev/"……

設定後

xx.xx.xx.xx - - [26/Mar/2010:00:00:00 +0900] "GET / HTTP/1.0" 200 14955 "https://blog.delphinus.dev/"……

84,513Byteだったトップページが14,955Byte(18%)になっている。5分の1とは大したものだが、ここまで効果があるのはhtml、js、cssファイルといったテキストファイルだけだ。画像ファイルにはほとんど変化がないのでテキスト主体のサイトに効果的だろう。

欠点としては、リクエストがある度に圧縮するのでサーバ負荷が問題になる。サーバのCPU使用率に余裕があるときに導入するようにしよう。


  1. htmlファイルとjsファイルのContent-Type設定が違うのだろう。 

3 thoughts on “【Apache】サイトのコンテンツ全てをgzip圧縮する

  1. [Apache]YSlowでF評価を受けた項目を向上させる

    とある条件下で、開発しているサイトのページ表示が非常に遅いという現象が起きた。 …

  2. Pingback: WordPressを高速化する9つのステップ | イリテク株式会社

  3. Pingback: WordPressを高速化する9つのステップ | イリテク

コメントを残す