サイト運営をしていてアクセス数が増えてくると当然転送量も増えるわけですが、それによってレスポンスが悪くなったり転送量制限に引っかかったりする場合があります。
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負荷に合わせて考える必要がありそうです。
コメント