静的生成と動的生成、Webページをビルドするコストは誰が支払うべきなのか

ネタフルの「[N] MovableTypeからWordPressへパーマリンクを引き継いで移行する方法」というエントリーより。

ネタフルではすぐに移行する必要性は感じていないのですが、エントリー数が16,000を超えるとリビルドにも2時間くらいかかるようになりまして、いろいろな可能性を探っておかないといけないかなぁ、とは思っています。

フルリビルドに2時間?!確かにそりゃやってられませんね。

…しかし、ちょっと待ってください。どうして16,000程度のエントリー数で2時間も掛かるのでしょうか?

僕はもう一つ、Movable Type で構築したブログを持っています。そちらのエントリー数は4,000を超えています。僕はスパム対策の為、mt-comment.cgi 及び mt-tb.cgi を自動的に renameする(そしてフルリビルドする)スクリプトを、毎週土曜日の朝4:30頃に起動しています。

ネタフルが16,000のエントリーで2時間を擁するのなら、4,000のエントリーを抱える僕のブログは、単純計算で4分の1、30分ほどの時間がかかるはずです。…とまぁ、そう単純には行かないのですが、数字だけを見ると、少なく見積もっても15分か20分はかかっても良さそうなものです。

ところが、昨日朝に実行されたスクリプトのログを確認すると、CGI ファイルをリネームしてフルリビルドするのに要した時間は、たったの7分でした。スクリプトを走らせるのは、アクセスの少ない朝の4時半頃です。だからというのもあるのかもしれませんが、ピーク時に走らせたとしてもそう大きく変わるとは思えません。

どうしてネタフルでは、フルリビルドにそんなに時間がかかるのか。もちろんサーバーのスペックにもよるのでしょうが、膨大なアクセス数を誇るネタフルが、僕のブログより非力なサーバーにいるとは思えません(ちなみにうちはさくらのプレミアム)。ネタフルの個別記事ページを見ると、なんとなく分かる気がします。メインの記事の他に、実にたくさんの要素が、3段カラムの中に所狭しと並んでいます。1ページに含まれる要素が膨大な為に、それだけリビルドに時間がかかるのでしょう。拡張子を見ると「html」ですから、もしかすると SSI を使用したり PHP 化を行うなどの、リビルド時間短縮の為の手段も取られていないのかも知れません。

では、この問題を解消する為に、Movable Type から WordPress への移行は有効なのでしょうか。…ある一面においては確かに有効だと思います。Movable Type は(デフォルトでは)Web ページを静的に生成するのに対し、WordPress は動的に生成します。この為、WordPress には「リビルド」自体が存在しないようです。当然、2時間という拷問のようなリビルド時間からは開放されるはずです。

と、実は僕、WordPress は触ったことがないので、ここからは Movable Type vs WordPress ではなく、Contents Management System(CMS)における Web ページの静的生成 vs 動的生成という観点でお送りいたします。

「静的生成だとリビルドに時間がかかりすぎる。記事数が増えるにつれ、どんどん時間がかかるようになって来た。このツールは重すぎて使えない。動的生成の CMS に乗り換えたら快適になった。動的生成最高。」なんて声がここ最近良く聞かれます。では、リビルド時間にストレスを感じているユーザーはみな、動的生成の CMS に乗り換えるべきなのかというと、すべてがそうとは言い切れません。なぜなら、動的生成の CMS で、消えたように見えるリビルド作業は、決して消え去ってしまったわけではなく、別の形で別のところに大きな負担となってのしかかかってくるのですから。

静的生成では、Web ページのビルド(構築)の為のコストは運営者側が負担します。これがリビルド作業です。ブログへの訪問者は、既に生成されているファイルにアクセスするだけで、ほとんどコストを負担しない、ストレスを感じずに済むはずです。これに対して動的生成では、Web ページのビルドの為のコストは訪問者が負担することになります。訪問者がブログを訪れる度、DBからデータが読み込まれ、テンプレートが読み込まれ、Web ページが生成されます。運営者がリビルド作業から開放される代わりに、訪問者がそのコストを負担することになるのです。

静的生成では、Web ページのビルドにかかるコストは生成する Web ページの規模に比例して大きくなります。訪問者、ページビューがどれだけ増えようが、関係ありません。これに対し動的生成では、ビルドにかかるコストは訪問者、ページビューの数に比例して大きくなります。もしもまだ始めて間もなく、エントリー数も少ないブログであったとしても、そこに膨大なアクセスがあれば、膨大なコストを支払わなければならなくなります。一人一人の訪問者が支払うコストは微細でも、それが積もり積もれば大きなコストとなり、そしてそれはサーバーへの高負荷となって現れます。

静的生成では 2時間の我慢で済んでいたものが、動的生成ではそこから開放される代わり、サーバーダウンを引き起こす可能性が確実に上がるのです。ダウンしないまでも、多くのレンタルサーバーでは高負荷時に CGI の動作を制限したりしますので、Web ページ自体が見られなくなったりします。静的生成なら、例え高負荷で CGI に実行が制限されたとしても、Web ページ自体はただのファイルですから閲覧することは可能です。これが先に、「動的生成の CMS に乗り換えるべきなのかというと、すべてがそうとは言い切れません」と書いた理由です。

また、訪問者数の少ないブログであっても、サーバーに高負荷を与える可能性があります。それが検索エンジンのクローラーや SPAM ボットによるアクセスです。静的生成から動的生成に乗り換えれば、確実にこれらのアクセスにに対する耐性が弱くなります。

もちろん動的生成であっても、優秀なキャッシュコントロールの仕組みを採用するなどすれば、サーバーへの負荷を抑えることができます。逆に静的生成においても、リビルドの負荷を下げるべく工夫できることはたくさんあります。mod_perl とか、mod_php とか、Memcached とか、なんとか、サーバーの負荷を下げる、運営者や訪問者の支払うべきコストを下げるための工夫は、世の中にたくさん存在しています。

ブログというものが世間一般に広く知れ渡るようになって、ずいぶんと経ちました。それなりにエントリを溜め込んだブログ、かなりのアクセス数を誇るブログも増えてきたことでしょう。ここへ来て、静的生成か、動的生成かという議論がずいぶん増えてきたのは、そんな背景があるのかもしれません。

言いたいのは結局のところ、静的にも動的にも長所短所があって、一概にはどちらが良いとは言い切れないということ。ブログの規模や、サーバー環境、運営者のスキルなどによっても大きく変わってきます。にもかかわらず、「このツールは使えない」とか、「こちらのツールの方が優れている」などと短絡的に書かれることがあったりして、寂しい思いをさせられることが多いのです(先に取り上げたネタフルのエントリーは違います)。単に個人の好みの問題でしかないのにもかかわらず。

なもので、こんなエントリーをいつか書きたいとずっと思っていました。まぁ、例によって何も解決してはいないのですが、タイトルの質問に答えるとすると、そのコストは運営者が払うべき、と個人的には思っています。静的か動的かにかかわらず、サーバーのスペックアップや、大規模な仕組みの導入など諸々含めて。