大量アクセスに弱いPukiWiki対策
PukiWikiはリクエストされるごとにWiki形式で書かれた文章をHTMLに変換しています。
1ページだけなら大した負荷にはなりませんが、アクセスが10、100と重なるとかなりの負荷になります。
毎回HTMLに変換するのは無駄が多いので、HTMLに変換したものをキャッシュ(保存)します。そのファイルをアクセス時に読み込むことで高速化と、負荷の軽減を実現します。
HTMLファイルのキャッシュ化には「bodycache」というプラグインを利用します。
数あるキャッシュ系プラグインの中でも運用の手間がかからず、正常に動作するお勧めのプラグインです。しかし導入にはPukiWiki本家のファイルを修正する必要があるなど、多少の専門知識が必要になるので、当サイトで導入方法・注意点を解説します。
導入に際して注意点
便利なbodycacheですが、いくつか注意点があります。
1.容量の増加
bodycacheはオリジナルのwiki文章と別に、HTMLに変換したキャッシュを「cacheディレクトリ」に保存します。そのため通常の倍以上の容量を食います。
しかし変換後のファイルもテキストベースのhtmlなので、大容量化の進む昨今のレンタルサーバでは問題になることは稀だと思います。
2.動的なページへ非対応
bodycacheは以下の条件でキャッシュを作成します。
- 1.記事を読み込んだ際にキャッシュが存在しない場合。(初回アクセス時)
- 2.記事の更新時。
そのため、更新された記事を調べて一覧表示する機能や、通常の更新と異なる「pcommentプラグイン」などを利用したコメントの挿入などには対応していません。
対策として特定のプラグインを利用しているページではキャッシュ機能を無効にするという対策が可能です。詳しくは下記導入方法を参照してください。
3.オートリンクへの非対応
PukiWikiでは先に[[hoge]]とリンクを書いておき、後にページを作成すると自動でページヘのリンクが作成される機能があります。キャッシュ作成時にリンク先ページがない場合は、リンクが作成されません。(hoge?の状態になる)
本家様でこの対策についてお伺いしたところ、以下の提案をいただきました。
- 1.更新頻度が少ないサイトの場合はページを更新した際に全てのキャッシュを削除する。
- 2.cron等を利用して、一定期間経過したらキャッシュを削除する。
どちらの対策も状況に合わせて行わないと逆にサーバの負担を増やすことになリます。サイトの状況に合わせて運用してください。
(2014年1月追記:アクアリウムWikiではお問い合わせフォームに使っているプラグインpkwkmailと相性が悪いため、現在は一時利用を見合わせています。)
bodycacheの導入方法
今回はPukiWiki 1.4.7_notbにたいしてパッチ処理を実行します。処理といっても「http://debian.fam.cx/dists/bodycache/」にある「bodycache_for_147nt_ra176.txt」を実行するだけです。
しかし、パッチ処理は慣れない方には多少ハードルが高く、PukiWikiを独自にカスタマイズしている場合は上手くパッチ処理されないことがあります。そこで今回は、1つ1つファイルを手修正していきます。
1.pukiwiki.php
まずはwikiの「/lib」にある「pukiwiki.php」を修正します。40行目あたりに以下のような記述があるので、bodycache用のコードを追加します。
require(LIB_DIR . 'html.php'); require(LIB_DIR . 'backup.php');
以下のようにする。
require(LIB_DIR . 'html.php'); require(LIB_DIR . 'backup.php'); // bodycache用 require(LIB_DIR . 'bodycache.php');
続いて135行目あたり、
$body = convert_html(get_source($base));
これを以下のように変更
// //bodycache用の変更 // //$body = convert_html(get_source($base)); global $enable_bodycache; if ( $enable_bodycache ) { $body = render_body( $base ); } else { $body = convert_html(get_source($base)); }
pukiwiki.ini.php
続いてルートディレクトリにある「pukiwiki.ini.php」を編集します。165行目あたり、トラックバック用の設定があるすぐ後に追記します。
// Show trackbacks with an another window (using JavaScript) $trackback_javascript = 0;
// Show trackbacks with an another window (using JavaScript) $trackback_javascript = 0; ///////////////////////////////////////////////// // Bodycache feature // enable bodycache or not // default : true $enable_bodycache = true; // use bodycache as default. If it's false, // #bodycache(enable) is required per page. // default : true $enable_bodycache_default = true; // If these (block) plugins are contained in page, bodycache will be disabled. // Users can increase this plugin list to control bodycache. // default : array( 'ls2', 'pcomment', 'include' ); $bodycache_disable_plugins = array( 'ls2', 'pcomment', 'include' );
ここで「$bodycache_disable_plugins」という行がありますが、ここで配列に追加したプラグインが使われているページではbodycacheが無効になります。
アクアリウムWikiでは更新ページ一覧を表示する「recent」も追加して、以下のようにしています。
$bodycache_disable_plugins = array( 'ls2', 'pcomment', 'include', 'recent' );
また、特定のページだけbodycacheを無効にしたい場合はページの先頭に以下の記述を追加することでキャッシュファイルの作成を無効にすることができます。
検索プラグインの「sitesearch」などを導入している場合は、検索結果のページに以下の記述が必要になります。
//#bodycache(disable)
同じく「pukiwiki.ini.php」にて、bodycacheはPukiWikiのオートリンクに対応していないため、190行目あたりにあるオートリンクの機能をオフにします。もともと「1」になっていた場合は変更する必用はありません。
///////////////////////////////////////////////// // _Disable_ WikiName auto-linking $nowikiname = 1;
bodycashe.php
最後に「libディレクトリ」にプラグイン本体である「bodycashe.php」をアップロードします。本家にはパッチファイルしかないので、当サイトでパッチ処理を実行して作成したファイルを配布します。(本家様でGPL v2ライセンスの由、確認済み)
以上、2つのファイルの修正と、1つのファイルの追加でキャッシュが有効になります。通常に導入されていれば、ページヘの初回アクセス時に「cache」ディレクトリにファイルが作成されているはずです。
効果の測定
それでは早速効果の測定です。今回は特別長いWikiファイルでテストです。5回アクセスしてみました。
bodycashe導入前
HTML convert time: 1.488 sec. HTML convert time: 1.476 sec. HTML convert time: 1.483 sec. HTML convert time: 1.476 sec. HTML convert time: 1.436 sec.
bodycashe導入後
HTML convert time: 1.683 sec. HTML convert time: 0.018 sec. HTML convert time: 0.015 sec. HTML convert time: 0.021 sec. HTML convert time: 0.024 sec.
導入後、初回アクセス時にはキャッシュを保存する関係で多少速度は落ちますが、2回目のアクセスから劇的にHTMLコンバーションタイムが短くなっていると思います。
なんと約70倍も高速になっています。速度だけでなく、CPU負荷も大幅に軽減されます。これでPukiWikiの苦手な大量アクセスもさばけるようになります。
アクセスが急増してレンタル鯖から追い出されそうだったので助かりました。
ありがとうございました。
広告ポチしておきました。
丁寧にコメントありがとうございます。
お役に立てたようで何よりです。
$bodycache_disable_pluginsや#bodycache(disable)の機能を取っ払うことはできますか?できるだけ簡潔にしたいと思っておりまして
私はプラグインの製作者ではないので、断定はできません。
その上で、恐らく取り払うことは可能です。しかし、機能を削除しても表示速度には何ら影響は無いはずです。
はじめまして。
現在「bodycache.inc.php」の配布元が消滅しており困っております。
どこかにアップロードをお願いできないでしょうか?よろしくお願いいたします。
コメントありがとうございます。
作った方の許諾がないため、当方で勝手に配布するのは難しいです。
お役に立てずすみません。