UNIX的なアレ:gihyo.jp出張所
第18回 知っておきたいApacheの基礎知識 その14
ネットワーク回線が遅くて,どうしてもパフォーマンスが出ないなんてことを経験したことはありませんか?回線の問題がサービスを提供している側だけでおきているなら,単純に回線を太くすればよいですね。しかし,ユーザ側のネットワーク回線が遅い場合はどのようにすればよいのでしょうか。
ユーザ側の回線を速くすることはできないので,その遅い回線を利用してどうにかしてパフォーマンスをあげる必要があります。
今回は,ユーザの回線が遅い場合に効果的なモジュールを紹介していきたいと思います。
遅い回線でパフォーマンスを出すためには?
それではユーザ側の回線が遅い場合にできることは何があるのでしょうか?基本的に,パフォーマンスを出すための方法は,1つしかありません。
「転送するコンテンツの総量を減らす」ことに尽きます。
まず,手っ取り早くできることは画像サイズを小さくすることです。とくにデジカメで撮った写真をリサイズせずにそのまま転送しているような場合は要注意です。
しかしそれでもまだまだ遅く感じるようでしたら,mod_expireとmod_deflateの導入を検討しましょう。
このモジュールはそれぞれ,回線が遅い際に有効なモジュールです。
それでは以降ではそれら説明をしていきます。
mod_expireでキャッシュさせる
まず最初に,mod_expireから見ていきましょう。mod_expireはexpire headerを付与することで,対象のコンテンツを効率よくユーザ側にキャッシュをさせる仕組みです。キャッシュといっても,前回紹介したようなmod_cacheのようなキャッシュではなくブラウザ内でキャッシュしておくことがポイントです。
CSSやJavaScript,画像ファイルなどに使うのが効果的です。
mod_deflateでコンテンツを圧縮
さて次は,mod_deflateの紹介です。これはレスポンスで返すコンテンツを圧縮して転送し,ユーザ側でまた展開するといった仕組みです。当然のことながら,サーバサイドで圧縮を行うため若干apacheの占めるCPU利用率は上昇します。
しかし,圧縮をして転送をすることで遅い回線でも効率良くコンテンツの転送を行うことができますね。
なお,mod_deflateはテキストファイルのみに有効です。そのため,画像ファイルには効果的ではありません。
主にCSSやJavaScript,HTMLなどのファイルに利用するのがよいでしょう。
モジュールを組み込む
それではmod_expireとmod_deflateを組み込んでいきましょう。なお,${APACHE_SRC_DIR}はapacheをコンパイルするときに利用したソースのディレクトリを指しています。
以下のコマンドでモジュールを追加してください。
$ sudo /usr/local/apache2/bin/apxs -a -i -c ${APACHE_SRC_DIR}/modules/filters/mod_deflate.c -lz
$ sudo /usr/local/apache2/bin/apxs -a -i -c ${APACHE_SRC_DIR}/modules/metadata/mod_expires.c
さて,モジュールが追加できたら正常にできているか確認をしてみましょう。
$ ls -l /usr/local/apache20/modules/mod_deflate.so /usr/local/apache20/modules/mod_expires.so -rwxr-xr-x 1 root staff 47427 May 12 10:11 /usr/local/apache20/modules/mod_deflate.so -rwxr-xr-x 1 root staff 35955 May 12 10:10 /usr/local/apache20/modules/mod_expires.so
上記の2つのファイルができていれば成功です。
設定ファイルへの追加
それでは,mod_expireとmod_deflateを設定ファイルに追記していきましょう。
LoadModule deflate_module modules/mod_deflate.so
LoadModule expires_module modules/mod_expires.so
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /usr/local/apache2/vhosts/www.example.com/htdocs
ServerName www.example.com
ErrorLog /usr/local/apache2/vhosts/www.example.com/logs/error_log
CustomLog /usr/local/apache2/vhosts/www.example.com/logs/access_log common
# Deflate Settings
# Deflateをかけるコンテンツを記述する
AddOutputFilterByType DEFLATE text/html text/plain text/xml
# Expire Settings
ExpiresActive On
# 設定するコンテンツと,キャッシュする期間を記述する
ExpiresByType text/css "access plus 1 days"
ExpiresByType text/html "access plus 1 days"
ExpiresByType application/x-javascript "access plus 1 days"
ExpiresByType image/jpeg "access plus 1 days"
</VirtualHost>
上記の設定が追加できたら,Apacheを再起動してください。
また,この設定を確認するためにも「第10回:知っておきたいApacheの基礎知識 その6」で紹介をしている,Firefoxのアドオン「LiveHTTPHeaders」をインストールしておきましょう。
それでは,確認してみます。
Apacheに対して,ブラウザからアクセスしてみてください。レスポンスが正常に返ってきたら,そのレスポンスのHTTPヘッダを確認してみましょう。
以下の2行があることを確認してください。
Expires: Wed, 13 May 2009 02:08:02 GMT
Content-Encoding: gzip
これがそれぞれ,mod_expireで追加されたヘッダと,mod_deflateで圧縮されたことを示すヘッダです。この2つのヘッダが表示されていれば成功です。
設定方法はコメントに書いたとおり,非常に簡単に行うことができます。ネットワーク回線の問題でパフォーマンスに悩んでいる方は,ぜひトライしてみてください。
[TIPS] YSlowでパフォーマンス計測
mod_expire,mod_deflateの設定がそれぞれできたらパフォーマンスの測定を行ってみましょう。YSlowというアドオンをインストールすることで,いま見ているページのパフォーマンスをランク付けしてくれます。
YSlowの中で,それぞれの分野にわけてパフォーマンス対策のランク付けを行ってくれています。この値を参考にしてパフォーマンスチューニングを行うのもよいですね。
まとめ
さて,今回はネットワーク周りを中心としたパフォーマンスのチューニング方法を紹介してきました。実際に,すでに運用されているサービスですとこの2つのモジュールは頻繁に使われていますので,いろいろなサイトでYSlowなどを使って調べてみても良いでしょう。
最適な値は時と場合によって異なってきますので,自分の運用するサービスにあった適正値を見つけたいものですね。

