負荷軽減のために

まず、このページを見る前にhttp://pukiwiki.sourceforge.jp/dev/?BugTrack/763に書かれていることを実行してください。

CSSを静的なファイルにする
Adv.でcssがphpになっている理由は、複数のCSSをマージするのと、圧縮転送するためと有効期限のヘッダーを出力するためです。このため、公式版に書かれていることを実行するメリットは薄いと思います。

PukiWikiの検索機能を使わない

PukiWikiに限らず、Wikiサイトを運営していて、もっとも負荷をかける処理は検索機能です。Namazuが導入可能なサーバーの場合、PukiWikiのページをNamazuのインデックスにつけるという方法があります。これにより検索機能を強化したり検索負荷を減らすことができます。あくまでも、Namazuはインデックス型のサーチエンジンであるため、負荷のかかりにくい時間帯(深夜)などにこれの更新処理を定期的に行う必要があります。

参考:pukiwiki:PukiWiki/Namazu

もっと、簡単な方法としてGoogleのサイト検索を使うという方法があります。これを検索窓に使用することでサーバーへかける負荷を減らすことができます。

ただし、いずれの方法もWikiの更新が即座に検索結果に反映されないという問題があります。

よく使う画像はCSSスプライトにする

ゲーム系サイトでは、アイコン専用のページを作成し、sword.pngのような画像を&ref(sword.png,アイコン?,nolink);のような形式で呼び出しているケースが多く見受けられます。

PukiWiki Advanceでは、SendFileヘッダーを加えたりキャッシュを聞かせるようLast-modifiedヘッダーを加えているなど、他のPukiWikiよりも添付ファイルによるサーバーに負荷をかかりにくくするための工夫はしてありますが、これを用いることで、Wikiの表記が簡単になる上、画像を読み込む回数が減り、表示も早くなります。また、プラグインを介さないため、サーバー負荷も大きく減らすことができます。

status.png

このような使用頻度の高い画像は、Wikiにアップするのではなく、左の画像のように一つにまとめてCSSスプライトにし、rules.ini.phpのルール設定で呼び出すようにしましょう。

この画像は、グランロード公国からいただきました。

まず、スタイルシートで以下のように指定します。

.status-icon{
	display: inline-block;
	width: 16px;
	height: 16px;
	line-height: 100%;
	background: transparent url('status.png') -1000px -1000px no-repeat;
	vertical-align: middle;
	margin:0 2px;
	text-align: center;
	text-shadow: none;
	color: transparent;
}

.status-icon-sword	{ background-position: 0 0; }
.status-icon-shield	{ background-position: -18px 0; }
.status-icon-wond	{ background-position: -36px 0; }
以下略

次にアイコンのメタ文字をrules.ini.phpの$str_rulesに追記していきます。

$str_rules = array(
	'&now;' 	=> '\&epoch\('.UTIME.'\);',
	'&date;'	=> get_date($date_format),
	'&time;'	=> get_date($time_format),
	'&page;'	=> get_short_pagename($vars['page']),
	'&fpage;'	=> $vars['page'],
	'&t;'   	=> "\t",
+	'&sword;'   	=> '<span class="status-icon status-icon-sword">Sword</span>',
+	'&shild;'   	=> '<span class="status-icon status-icon-shield">Shild</span>',
+	'&wond;'   	=> '<span class="status-icon status-icon-wond">Wond</span>',
...
);

すると、例えば剣の画像をWikiに表示したい時に&sword;と入れるとそこの部分がsword.pngに変換されます。こういった工夫で、編集も容易になります。

Cloud Flareなどのサービスを利用する

独自ドメインを使っている場合は、負荷軽減だけでなく、荒らし対策のためにもぜひ実行してみてください。要は、ネームサーバーをCloudFlareで管理する形になるだけですが、Cloud Flare側でコンテンツの内容をキャッシュしたり、不審なアクセスを弾いてくれます。

また、GeoIPが使えないサーバーでもこのサービスを利用すると使えるようになります。(もっとも、PukiWikiでは、国別アクセス制限でしか使用されていないためCloudFlareの脅威コントロールから弾いたほうがいいと思います)

詳細は、./CloudFlareにて。

参考:

Memcacheモジュールをインストールする

PukiWiki自体は、メモリなどのハードウェアが高い時代に作られたのでかなり対策は練られていると思います。しかし、最近のサーバーは、メモリが安くなっていることもあり標準で256M使えるサーバーも珍しくありません。足りなくなったメモリも、Swapするだけなので、少なくもともメモリ容量が原因でサーバーが不安定になることはないと思います。

PukiWiki Adv.ではキャッシュ処理を全てMemcacheを用いてメモリ上で行うようにすることで、ディスクのIOによる遅延や負荷を軽減させたり、動作を高速化を実現できます。

Debian系の場合以下のコマンドでインストールできます。

sudo apt-get install php5-memcache

Memcacheを別のサーバーで起動しているなど、特殊な環境でない限り、PukiWiki上で特に設定する必要はありません。インストールしたあとは、忘れずにiptablesでポート(通常は11211)を開きましょう。

なお、現在のところ仕様上サーバーをリセットしたり、memcacheをフラッシュしたりするとキャッシュデーターが全て消えてしまいます。

PHPを5.4にアップグレードする

PukiWiki Adv.PHP5.4に対応しています。多くの場合において5.4のほうが動作が軽量です。まずは、PHPをアップグレードしましょう。PHP5.4は、PHP5.3系と比べて少なくとも9%、条件によっては7割程度の性能向上が見込めるとのことです。

Ubuntuの場合のインストール例:

sudo add-apt-repository ppa:ondrej/php5
sudo apt-get update
sudo apt-get install php5 php5-apc php5-common php5-curl php5-fpm php5-gd php5-memcache php5-xdebug

ただし、他のPukiWikiシリーズは動作しなくなります。

Apacheを使わずnginxやcherokeeを使う

Apacheは広く使われていますが、プロジェクトが大きくなりすぎて設定ファイルが煩雑になったり高速化が遅れている面があります。そこで、nginxやcherokeeサーバーでPHP-FPMを用いた構成にすることを検討してください。

特にnginxは、ニコニコ動画などで使われおりそこそこ実績があります。設定例は、Technical Note/ReWriteを参考にするといいでしょう。cherokeeは実績こそ少ないですが、nginx並のパフォーマンスがあり、日本語化されたGUIによる簡単な操作でWebサーバーの設定ができます。

初心者はcherokee、コマンドラインが好きな人はnginxという感じでいいと思います。1

WebサーバーとPHPアプリケーションサーバーを分割する

上記に書かれていることをすべてやってもなお重い場合、phpを実行するサーバーをWebサーバーとは別にして負荷分散させることを考慮してください。一日のアクセスが10万ぐらいから効果が見込めます。

例えば、nginxの走るサーバーから192.168.1.2のポート9000でphp5-fpmにphpの動作を参照する場合、

PHPを走らせる側の/etc/php/fpm/pool.d/www.confは、

+listen = 127.0.0.1:9000
-listen = /var/run/php-fpm.sock

とし、Webサーバー側のbackend.confは、

-fastcgi_pass    unix:/var/run/php-fpm.sock;
+fastcgi_pass    192.168.1.2:9000

という感じになります。実際はこの他にファイヤーウォールの設定や、ユーザの権限の設定などいろいろ必要になります。(もっとも、PukiWikiでそこまで高トラフィックのあるサイトというのは見たことがありませんが・・・。)

また、attachプラグインを呼び出すアドレスを別ドメインにするだけでも負荷軽減になります。(YahooやGoogleがやっていますね)