セキュリティ   ログ   キャッシュ   ネットワーク   圧縮   その他

コンテンツ圧縮

Apache のコンテンツを圧縮してパフォーマンスアップするための Tips を紹介します。
注)主に x86 Linux および Apache の組み合わせで動作確認した結果をもとにしています。すべての OS および Apache の Version での動作を保証するものではありません。
更新 目的方法
2015/12 対象の設定 下記の例では、アイコン以外の画像、PDF、Flash、実行ファイルおよびもともと圧縮済のファイルを圧縮対象外に設定しています。
したがって、エディターで開けるファイル (HTML など) およびアイコンファイルなどが圧縮対象になります。
設定について詳しくは、 mod_deflate をご覧ください。
なお、PHP プログラムの場合、Apache の設定で出力を圧縮する代わりに、下記の2つの方法もあります。
PHP プログラムで画像ファイルやその他のバイナリーを出力したい場合だけ非圧縮にしたい場合や、httpd.conf の編集権限を持たない場合に使用できます。
1) php.ini で zlib.output_compression = On を指定。
2) ob_gzhandler() 関数を使用。
ただし、圧縮済のデータが PHP から Apache に渡されるため、PHP プログラムによる出力に対して dont-vary で制御したい場合があっても制御できないことに注意してください。
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png|pdf|swf|exe|gz|zip)$" no-gzip dont-vary

Header append Vary User-Agent env=!dont-vary
</IfModule>
SetEnvIfNoCase の行の 「gif」 の直前の 「?:」 は、正規表現の () 内の記述に一致した部分を記憶しておく必要がないことを明示しています。
FilesMatch の行の 「txt」 の直前の 「?:」 も同様です。メモリーの節約になります。なお、IBM i の Apache では「?:」という表現は使用できません。
2016/10 事前圧縮 SetOutputFilter DEFLATE による方法では、ブラウザからアクセスされるごとに圧縮処理を行ってからブラウザにレスポンスを返します。
あらかじめ圧縮しておいたコンテンツを利用する方法もあります。
下記の例では、html ファイル、xml ファイル、アイコン、JS ファイルおよび CSS ファイルに対して圧縮済のファイルが存在する場合、圧縮済のファイルをブラウザに返します。
<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP:Accept-Encoding} gzip
  RewriteCond %{REQUEST_URI} \.(html|xml|ico|js|css)$
  RewriteCond %{REQUEST_FILENAME}.gz -s
  RewriteRule .* %{REQUEST_URI}.gz [L]

  <FilesMatch "\.html\.gz$">
    ForceType text/html
  </FilesMatch>
  <FilesMatch "\.xml\.gz$">
    ForceType text/xml
  </FilesMatch>
  <FilesMatch "\.ico\.gz$">
    ForceType image/x-icon
  </FilesMatch>
  <FilesMatch "\.js\.gz$">
    ForceType text/javascript
  </FilesMatch>
  <FilesMatch "\.css\.gz$">
    ForceType text/css
  </FilesMatch>

</IfModule>

下記のシェルは、/var/www/html/somedir ディレクトリーのファイルを圧縮する例です。
このシェルの中の/var/www/html/somedir 部分を変更しながら繰り返し処理する際のことを考慮して、一時的に使用する /tmp を掃除してから使用するようにしています。
cd /tmp
rm -f *.html *.xml *.ico *.js *.css *.gz
cd /var/www/html/somedir
cp    *.html *.xml *.ico *.js *.css /tmp
cd /tmp
gzip  *.html *.xml *.ico *.js *.css
cp -u *.gz /var/www/html/somedir