Archive for 2月, 2010

XREAでWordPressの表示速度を改善する方法 まとめ

土曜日, 2月 13th, 2010

週末をつかって、このブログ(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設定画面

XREAのcron設定画面

参考文献

ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール
ハイパフォーマンスWebサイト
スケーラブルWebサイト
スケーラブルWebサイト
Apacheクックブック 第2版 ―Webサーバ管理者のためのレシピ集
Apacheクックブック

参考URL