週末をつかって、このブログ(WordPress)の表示速度改善に取り組んでみました。
ひどいときは10秒も表示にかかってました。
遅かった主原因はAmazonのコンテンツ連動広告なのですが、それ以外でもいろいろ調整したので
メモを残しておきます。WP-CacheなどのWordPressのプラグインについては、そこらじゅうで言及されてるので省略。
最終的に5秒が1秒になったよ!

ページ速度改善
gzip圧縮
CSSやJavaScriptなどをgzipで圧縮して、通信料を減らします。WPのディレクトリに以下の内容を.htaccessという名前で保存します。
mod_gzip_temp_dir に指定するディレクトリをあらかじめパーミッション777で作成しておく必要があります。
<IfModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_keep_workfiles Yes
mod_gzip_minimum_file_size 1024
mod_gzip_maximum_file_size 0
mod_gzip_maximum_inmem_size 60000
mod_gzip_dechunk Yes
mod_gzip_temp_dir "/virtual/majide/public_html/blog.majide.com/tmp"
mod_gzip_item_include mime "application/x-httpd-cgi"
mod_gzip_item_include mime "application/x-httpd-php"
mod_gzip_item_include mime "application/x-javascript"
mod_gzip_item_include mime text/*
mod_gzip_item_include mime "httpd/unix-directory"
mod_gzip_item_include file "\.shtml$"
mod_gzip_item_include file "\.htm$"
mod_gzip_item_include file "\.html$"
mod_gzip_item_include file "\.php$"
mod_gzip_item_include file "\.pl$"
mod_gzip_item_include file "\.cgi$"
mod_gzip_item_include file "\.css$"
mod_gzip_item_include file "\.js$"
mod_gzip_item_exclude mime "image/.*"
mod_gzip_min_http 1001
</IfModule>
Expires ヘッダの追加
HTTPレスポンスヘッダにExpiresヘッダを加えると、コンテンツの有効期限を設定することができます。
ブラウザは設定された有効期限内であれば、ローカルにキャッシュされたファイルを利用します。
※注意 一度、キャッシュされたデータは有効期限がくるまで更新されません。
画像を更新する場合などはファイル名も変更し、キャッシュされたデータが使われないようにする必要があります。
XREAにはmod_expiresモジュールがインストールされていないため、mod_headersモジュールを利用してムリヤリExpiresヘッダを設定します。mod_headersは任意のHTTPレスポンスヘッダを設定するモジュールです。
■ mod_headers の使用例
Header set Expires Sat, 20 Feb 2010 08:21:05 GMT
mod_headersでは固定の文字列しか設定することができないので、Expiresヘッダを動的に生成するcronを仕込みます。
以下の例では、画像(jpg,png,gif)の有効期限を1週間に設定しています。
<?php
// 上書きする.htaccessファイルのパス
define('HTACCESS_PATH', '/virtual/majide/public_html/blog.majide.com/.htaccess');
define('TMP_HTACCESS_PATH', '/virtual/majide/public_html/blog.majide.com/.htaccess_tmp');
$offset = 7 * 24 * 60 * 60; //有効期限は7日
$expire = gmdate('D, d M Y H:i:s', time() + $offset)." GMT";
// ここにもともとの.htaccessの内容を記載
$htaccess = '
<IfModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_keep_workfiles Yes
mod_gzip_minimum_file_size 1024
mod_gzip_maximum_file_size 0
mod_gzip_maximum_inmem_size 60000
mod_gzip_dechunk Yes
mod_gzip_temp_dir "/virtual/majide/public_html/blog.majide.com/tmp"
mod_gzip_item_include mime "application/x-httpd-cgi"
mod_gzip_item_include mime "application/x-httpd-php"
mod_gzip_item_include mime "application/x-javascript"
mod_gzip_item_include mime text/*
mod_gzip_item_include mime "httpd/unix-directory"
mod_gzip_item_include file "\.shtml$"
mod_gzip_item_include file "\.htm$"
mod_gzip_item_include file "\.html$"
mod_gzip_item_include file "\.php$"
mod_gzip_item_include file "\.pl$"
mod_gzip_item_include file "\.cgi$"
mod_gzip_item_include file "\.css$"
mod_gzip_item_include file "\.js$"
mod_gzip_item_exclude mime "image/.*"
mod_gzip_min_http 1001
</IfModule>
';
$htaccess .= <<<END
<FilesMatch "\.(png|jpe?g\|gif)$">
<IfModule mod_headers.c>
Header set Expires $expire
</IfModule>
</FilesMatch>
END;
if (file_put_contents(TMP_HTACCESS_PATH, $htaccess)) {
rename(TMP_HTACCESS_PATH, HTACCESS_PATH);
}
?>
Xreaでは、cronは必ずシェルでなければならない制限があるので、PHPを実行するシェルを用意します。
#!/bin/sh
/usr/local/bin/php /virtual/majide/genhtaccess.php
最後にXREAの管理画面からシェルスクリプトをcronに設定して完了です。動かすのは1日に1回程度で十分でしょう。

XREAのcron設定画面
参考文献
参考URL