アクセス数が増えてくると表示速度が遅くなったりすることもしばしば。まあ、Apacheのプロセスの上限を増やせば良いんでしょうけれど、それにはメモリを増やす必要があり、メモリを増やすには先立つものが。
メモリを増やす前にやれることがあるんじゃないかといろいろ試した中の1つがApacheのExpireとDeflateの機能を利用することでした。意外と効果があるかも?
Expireは、極端に言うと、指定した期間はブラウザに保存されたキャッシュを読め、ということが出来るものです。ブラウザに保存されたキャッシュを読むので、サーバーから全てを読み込むより表示速度が速くなります。キャッシュがなければ意味が無いわけで、一見さんに対してはこの方法はあまり意味がありません。でも、頻繁にアクセスする人に対しては(キャッシュを貯めない設定とかにしていなければ)有効に働きます。
一方、Deflateは、サーバにあるデータを圧縮してからブラウザに送信するものです。転送するファイルサイズが小さくなるので、結果的に転送時間が短くなります。
設定方法
まず、Apacheのモジュール、mod_expiresとmod_deflateが読み込まれていることを確認します。CentOSの場合は、httpd.confの中に以下の記述があればOKです。まあ、特に設定をいじっていない場合は、デフォルトで利用可能になっていると思うのですが。
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
設定されていることを確認したら、同じくhttpd.confの中に以下のような記述を追加します。記述する場所はとりあえずどこでも大丈夫みたいです。
<Directory "/var/www">
# expire setting
ExpiresActive On
ExpiresByType application/x-javascript "access plus 3 days"
ExpiresByType text/javascript "access plus 3 days"
ExpiresByType text/css "access plus 3 days"
ExpiresByType image/jpeg "access plus 3 days"
ExpiresByType image/gif "access plus 3 days"
ExpiresByType image/png "access plus 3 days"
# deflate setting
AddOutputFilterByType DEFLATE text/html text/plain text/css
AddOutputFilterByType DEFLATE text/javascript application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
</Directory>
上記の設定だと、wwwディレクトリ以下にあるファイルに対して、ExpireとDeflateが適用されます。
Expireはjavascriptとcss、あとは画像ファイルに対して適用されるようにしました。期間は3日間としています。htmlに対してはExpireを設定していません。htmlがキャッシュされちゃうと、人によってはトップページが3日間変化しない自体が発生しちゃうかもなので。。
Deflateはhtmlとjavascriptに対して適用されるようにしてあります。(なんでCSSには適用してないんだろう、自分。)画像ファイルに対して圧縮をかけていないのは、圧縮をかけてもあまり意味が無いためです。jpgだとかgifだとかpngだとかはそれ自体、既に圧縮された状態なので、圧縮をかけるとあんまり小さくならないどころか、逆にサイズが大きくなっちゃったりします。
Deflateのログ
ちゃんと圧縮されているのか、何%くらいに圧縮されているのか知りたいときはhttpd.confに以下の記述をするとログを吐いてくれます。Apacheのログディレクトリの中にdeflate_logと言うファイル名で、ログが残ります。
#
# deflate log setting#
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%) %{User-agent}i' deflate
CustomLog logs/deflate_log deflate
何%くらい圧縮されたか分かるので見てるとちょっと面白い。ログの量が多くなりますし、そんなに意味があるログでもないと思うので、確認したらコメントアウトしておいた方が良いかも。
設定の効果
体感としては、「設定前よりも若干、気持ち、速度が速くなったような気がする」という感じです。キャッシュの効果はたしかにあるっぽい。
正直、それで満足してベンチマークとか全然取ってなかったのですが、ふと、googleのウェブマスターツールを見たら、クロールのデータにテキメンに効果が現れていました。。
7月の終わりに設定をしたのですが、8月の「クロールされたページ数」は7月以前とほとんど変わっていないのに対して、「ダウンロードされるキロバイト数」ががくんと下がっています。「ダウンロード時間」もベースラインが、若干ですが、下がっているように見えます。(グラフが平坦になっただけかも。)
ちなみに8月の頭当たりにダウンロード時間ががつんと上がってますが、これは長岡まつりの影響でアクセスが集中したためと思われます。恐るべし長岡まつり。。
まあ、速度的にはそんなに劇的な変化があるわけではないですが、何もしないよりはマシかも、という感じで利用してみると良いと思います。
参考
- mod_expires – Apache HTTP サーバ
- mod_deflate – Apache HTTP サーバ
- floatingdays: Apacheチューニングメモ(Expires、deflate)
できるPRO Apache Webサーバー 改訂版 Version 2.4/2.2/2.0対応 できるPROシリーズ
- メーカー:インプレス
- カテゴリ:Kindle版
- 発売日:2013/02/17