Apacheのmod_deflateでデータを圧縮して転送量を削減する

サイト運営をしていてアクセス数が増えてくると当然転送量も増えるわけですが、それによってレスポンスが悪くなったり転送量制限に引っかかったりする場合があります。

Apacheにはそれを解決するためにmod_deflateという便利なモジュールがあり、コンテンツをgzipに圧縮して転送量を改善することができます。

使用したOS

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)

使用したApache

[root@localhost ~]# /usr/local/apache2/bin/apachectl -v
Server version: Apache/2.4.12 (Unix)
Server built:   Apr 12 2015 03:53:10

mod_deflateモジュールを読み込む

まずはhttpd.confを開きます。

vi /usr/local/apache2/conf/httpd.conf

次に下記を探してコメントアウトを削除します。

#LoadModule deflate_module modules/mod_deflate.so
 ↓
LoadModule deflate_module modules/mod_deflate.so

最後にApacheを再起動すれば完了です。

/usr/local/apache2/bin/apachectl restart

mod_deflateの設定

圧縮を有効化

最初に下記をhttpd.confに追加して圧縮を有効化します。

<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
</IfModule>

「SetOutputFilter DEFLATE」でデータ送信前に圧縮するように設定します。

圧縮するファイルを指定

MIMEタイプを指定することで圧縮処理を制限することができます。
これにより無駄な処理や負荷がかかる処理を回避します。
下記をIfModule内に追記します。

AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/atom_xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php

どのファイルを圧縮するかは環境に合わせて適宜変えてください。

特定のファイルを圧縮処理から除外

容量の大きいファイルやそもそも最初から圧縮されているファイルを圧縮すると余計な負荷がかかり、逆にレスポンスが悪くなります。
なのであらかじめ除外するファイルを指定しておきます。
下記をAddOutputFilterByTypeの前に追記します。

SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico) no-gzip dont-vary
SetEnvIfNoCase Request_URI _\.utxt$ no-gzip

今回は画像ファイルの除外を指定しています。

圧縮に未対応のブラウザを除外

古いブラウザによっては圧縮されたデータに対応できない場合があります。
今となってはあまり気にする必要は無いかもしれませんが一応設定しておきます。
下記をSetEnvIfNoCaseの前に追記します。

# Mozilla4.06~8はバグにより除外
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# Mozilla4系はHTMLだけ圧縮
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Internet Explorerの場合は除外を回避
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

設定が完了したらApacheを再起動してください。

/usr/local/apache2/bin/apachectl restart

動作を確認してみる

適当に1000バイト(半角1000文字)のファイルを用意してみます。

 

まずはmod_deflateを使わずにアクセスして確認。

 

続いてmod_deflateを有効化してアクセス。

データ量が1.3キロバイトから363バイトに減っているので、約4分の1に圧縮できています。

逆に処理時間が9msから18msに増えているためレスポンスが悪くなっているように見えますが、アクセスする度に増減して変化するのでサーバーの状況次第なようです。

実際に使用するかどうかは現在のCPU負荷に合わせて考える必要がありそうです。

コメント

タイトルとURLをコピーしました