top

ダイナミック・パブリッシングを快適に使う10の方法

ダイナミック・パブリッシングでサーバーの負荷を下げ、頁表示も速くするにはどうしたらいいか?という質問を受けたこともあって、ちょっとエントリーを設けてみました。

1.サーバーは選ぶ(PHP編)
MySQL、PostgreSQL、SQLite2のどれかが使えてmod_rewriteが使えるのは当然として、PHPがモジュール版で動けばベスト。XREAではPHPがモジュール版で動くので、CGIモードで動くPHPに比べて「スクリプト実行時間、使用可能メモリー量が約4分の1になる」そうです(サポート板の公式見解より引用)。つまり重さも負荷もCGI版に比べてはるかに少なくて済むので動的生成でもサーバーにかける負担も少なくて済み、頁表示も軽い。アクセスが多いサイトでもけっこう使用に耐えるようです。

2.サーバーは選ぶ(データベース編)
ダイナミック・パブリッシングはアクセスがある毎にデータベースからデータを取り出して再構築しているので、肝心のデータベースが重いと頁表示スピードにまで影響することがあります。できればデータベースは共有別サーバーになっていないところをおすすめ。mt-config.cgi(データベースの設定)で DBHost localhost と書けるところです。

結論から言ってしまうと、実は上の2点が満たされていれば、ダイナミックでの頁表示やサーバー負荷などはCGIほどには気にするものにはならないと思います。PHPは本来、軽くて高速なのが特徴ですから。XREAでは管理画面でCGIの負荷値を見ることが出来ますが、ダイナミックはPHPのため、CGIの負荷ポイントには計上されません。従ってダイナミック頁にどれだけアクセスがあっても、管理画面の負荷ポイントは常に0ptです。ダイナミックなのに負荷が出ている、という場合はダイナミック動作部分ではなくて、mt-tb.cgiとmt-comments.cgiがスパム攻撃されている可能性の方を疑う必要があるかと思います。あと、mt-search.cgiへのロボット攻撃ですね(タグを使っている場合、実はこれがけっこうあるのですよ)。ともかくダイナミックのせいではないです。

ただしXREAでもPHPをCGIモードで動かしていたり(XREAはユーザーが自分でモードを選ぶことが出来ます)、さくらのようにPHPがCGIモードで動くサーバーだと、少し勝手が違ってくるかと思います。機能としてはPHPでも負荷としてはCGIに計上されることになると思うので。そこで、そういう場合に心がけておけば役に立つのではということを3項以下にまとめてみようと思います。もちろん上2つの条件を満たす場合でも実行すれば更に軽くできますので、よいと思います。

【基本編…静的・動的に関係なく頁表示を速くする基本事項】

3.ページ(テンプレート)を軽くする
WEBページを作成するに当たっての基本中の基本。1頁内のソースの量が少なければ少ないほど頁表示にかかるスピードも体感重さも軽減できます。当然その分サーバー負荷も減ります。3カラムより2カラムの方が、そして2カラムより1カラムの方が軽くて速い。カテゴリはタイトルのみの一覧表示にする、頁分割機能を使って1頁に載せるエントリーは5つ以内にする、「続きを読む」の折りたたみは止める(折りたたみ系はスクリプトで見えなくしてるだけであって、ソースはむしろ無駄に膨れ上がっているので、知らず知らずのうちに頁表示を重くする原因になる)、など工夫次第でいくらでもソース軽減は出来ます。
私の目標は「電話回線で5秒以内で表示できること」
なに、今時そんなの無理だって!? でもこれを実行できたらダイナミックでも下手な静的頁より劇速で表示できるようになると思います。

4.大きな画像は適切な大きさにリサイズするか、サムネイルからリンクするようにする
でかくて重たい画像を何枚も貼り付けるとその分頁表示が遅くなります。Photoshopなどで適切な大きさにリサイズする、大きな画像のまま見てもらいたい場合は小さなサムネイルを用意してそこから開いてもらうなど工夫します。

☆なお、サムネイルを作る際には、間違ってもimgのwidth="100" height="80"とかで見かけの寸法だけ変更するなんてのはやっちゃ駄目ですよ! これは見かけを縮小してるだけでロードされる画像のサイズは変わらないからです。これは昔からWEBサイト作成者の間ではやってはいけないホームページの掟!!として知られ渡っている常識です。面倒でもPhotoshopなどで専用のサムネイル画像を作りましょう。

5.他サーバーから情報を取り込むのはやめる
いわゆる直リンクというやつです。最近はこの手のサービスが増えてきてますが(WEB2.0とかいうやつ?)、先方のサーバーが立て込んでたりするとそこで表示がストップしたりして頁表示速度を落としてイライラさせる原因になります。ブログパーツ系もそういうのが多いですね。広告の類もそうですね。そもそもそういうサービスやブログパーツを貼り付ける必要、ありますか? サイトに表示させるものは全て自サーバーの中から、が基本であり大原則。頁表示を重くさせる原因はダイナミックにあるとは限らないのです。

6.javascriptやAjaxは使いすぎない
これらの使いすぎも頁表示を重くする原因になります。そのjavascript、本当に必要ですか? そのAjax、本当に必要ですか? スパム対策などでどうしても必要というものならともかく、単なる飾りやエフェクト効果だけなら、なくてもかまわないですよね。見かけのかっこよさではなく、中身で勝負しましょう!

7.スパムは来させない
管理画面が重たかったり、ダイナミック表示が重たいと感じる原因は意外なところにあったりします。実は大量のスパムでトラックバックCGIやコメントCGIが攻撃されていて大きな負荷を生じさせていることがあります。スパムを弾くプラグインは多々ありますが、これらはスパムを表面から見えなくしているだけで、CGIに大量アクセスされ負荷が生じている状態に変わりはないので、根本的な解決方法はズバリ、スパムをこれらのCGIにアクセスさせないことです。一番効果的なのはmt-tb.cgiとmt-comments.cgiのリネームです。

そしてここからがポイント。リネーム後のmt-tb.cgiとmt-comments.cgiをスパマーに知られないようにすること。<$MTEntryTrackbackData$>は全て削除し、javascriptを使ってソースからもこれらの記述を一切排除。この対策を行って以来、1件のスパムも来なくなりましたから、効果はそうとうあると思います。

【ダイナミック編…ダイナミック特有の設定・注意点について】

8.キャッシュを上手く利用する
MTのダイナミック・パブリッシングにはキャッシュ機能が用意されています。これは3.1でダイナミックが登場した当初からある機能ですが、MT4では管理画面からチェックするだけで使えるようになったので更に便利になりました。3.35以前での導入方法はこちらを参照。キャッシュ機能には2種類あります。

A)ページ・レベルのキャッシング($mt->caching =true;)
サーバー側でリクエストがあった頁をキャッシュしてくれる機能です。つまり「その頁に最初のアクセスがあった時にキャッシュ(静的頁と同じようなもの)が生成される」ということですね。キャッシュされた頁はcacheディレクトリに保存されます。一度キャッシュが出来たら、次にその頁に変更があるまではキャッシュが使われることになるので、静的頁とほぼ同じスピードで閲覧できるようになります。

ただしこのキャッシュ機能は頁分割のような動的な機能とは両立しないという弱点があります。頁分割を行う場合は下の条件付きリクエストを使われるといいと思います。

B)条件付きリクエスト($mt->conditional =true;)
これは閲覧者側のキャッシュを使うようにしてくれる機能です。WEBページを閲覧すると自分のパソコン内に見た頁のキャッシュが出来ますよね。頁に変更がない限り、閲覧者側のキャッシュを表示するようにしてくれますので、転送量も抑える効果があるようです。

AとBの違いは使われるキャッシュがサーバー側にあるか、閲覧者側にあるか、です。

9.共通部分は静的パーツ化して<$MTInclude file="ファイル名"$>で読み込むようにする
バナー、サイドバーなど全頁で共通して使われる部分は静的別ファイル化して<$MTInclude$>で読み込むようにします。この時、moduleではなく、fileを使うのがポイントです。複雑なMTタグが組まれるパーツをあらかじめ静的生成させて別に作っておけば、ダイナミック表示時には既に出来上がっているHTMLを読み込むだけになりますから、その分動かすMTタグを減らすことが出来ます。パーツ化された部分は静的生成のためPerlのプラグインが使えますから、ダイナミック頁でもPerlのプラグインが使えるようになるという利点もあります。また共通部分をパーツ化することにより、管理の手間も省くことが出来ます。
静的パーツ化した部分はインデックステンプレートと同時に再構築されるようにしなければいけませんが、全頁を再構築することを考えたらパーツ数枚程度なら特に問題はないのでは。このようにMTでは1枚の頁の中に静的・動的両方の機能を取り入れることができますので、静的・動的にとらわれず両者のいい面をミックスして使っていけばいいと思います。

☆1つ注意点が。
アーカイブはダイナミックにしてもindex.htmlは静的生成にしているケース、ありますよね。index.htmlやarchives.htmlを静的生成にしている場合は、<$MTInclude file="ファイル名"$>は使わず、該当部分を直接テンプレートに記述して下さい。理由は再構築される順番が、index.htmlやarchives.htmlの方がパーツより早いからです。そのため、fileで読み込むと更新される前の情報が読み込まれ、1テンポ遅れた状態になります(^^;。インデックステンプレートは再構築の順番に注意を。

<注:MT4.38以上をお使いの方へ>
MT5.13、5.07、および4.38以降のバージョンではfileモディファイアが標準で無効化されています。fileモディファイアを使うにはmt-config.cgiに以下を追記します。

AllowFileInclude 1

10.動的生成頁からはMTタグの数を出来るだけ減らす
上と連動しますが、共通部分や重たいMTタグが使われる部分は静的にして動的頁の負担を減らすことで、頁表示を速く出来ます。当ブログでは重たいカレンダー部分は静的生成させておいたものをダイナミック頁から表示するようにしています。


頁表示のスピードは様々な要因が絡んでそれらが総合された結果として出てきます。だから、頁表示が重い=ダイナミックのせい、と短絡的に考えるのではなく、他に原因はないかよく調べてみることも大事かと思います。実際には静的・動的以前の段階で引っかかっているケースもけっこう多いような気がします。

また自分の頁には何が必要で何が必要でないかを見極め、無駄をそぎ落とせば自然に見やすくアクセスしやすい頁になると思います。そのカスタマイズは本当に必要か? サイト(ブログ)を作って何を発信したいのか。何をやりたいのか。最後はそこに行き着くのかもしれません。

 

コメント

こんにちわ^^

すっごく参考になりました。
表示速度重要ですよね。

> 私の目標は「電話回線で5秒以内で表示できること」

電話回線で5秒はすごい Σ( ̄Д ̄;)!!
わたしは「ONLINE(and Firefox)で8秒以内!!」を目標にしてます。

でも、コンテンツはそのままで可能な限りスリム化が目標です。
なので物理的に限界あるのですが、やっぱり自分もブログを楽しみたいですしね 。

外部サービスはかなりネックです(´Д`;)何とかせねば!!
あと、共有サーバってのも・・・。

サーバはそろそろ更新時期なので、わたしの欲求を満たせるようなサーバを検討してます♪
FastCGIが使えるレンタルサーバ知りませんか!?

こんにちは。^^
電話回線時代からWEBサイトを運営してきたので、頁を軽くすることについては、たたき上げられて育ちましたから(笑)。
CGIでもHTMLを表示するだけなら、負荷もほとんどかからないし頁も一瞬で表示されるものなんですよ(同じサーバー内でWingMemoよりずっとアクセスの多いアニメファンサイト用の掲示板を運営しているので分かります)。
やっぱり頁表示時にスクリプトが多数動いているとか、外部サーバーやDBサーバーの影響とか、何らかの要因が加わって負荷が生じたり重たくなっていることが多いように思います。

>FastCGIが使えるレンタルサーバ
うーん、分からないですね…。XREAも無理だったんじゃないか…と思うんですが、共有サーバーで使えるところ、あるのかしら??
さくらはこのクラスの共有サーバーの中ではそうとういろいろなことが出来るサーバーじゃないかと思うんですが(XREAでは駄目でもさくらなら出来る、ということもけっこうあるような気がしますし)、いっそ自宅サーバーに挑戦されるとか…。私にはそこまでは無理ですけど(^^;。

こんにちわ^^

> 電話回線時代からWEBサイトを運営してきたので、頁を軽くすることについては、たたき上げられて育ちましたから(笑)。

だからいろいろ詳しいんですね♪
経験を元にした内容は信憑性があってとってもためになります!!

> うーん、分からないですね…。

やっぱりないのかなぁ。残念。
海外のサーバだとあるみたいなんですけど・・・海外だとサポートも心配だし、表示速度なども気になるところ。

XREAの無料体験にTRIALしてみようかな。

こんにちは~。
そうですね、サーバーは国内にあった方が安心しますよね。

XREAはサーバーを自分で選べるのが面白いところだと思います。さくらやロリポップでは申込時に割り当てられたサーバーしか使えないですよね。
XREAだと常時4~5個くらいから選べるようになっていて、サーバーによってPHPやMySQLのバージョンが違うんです。サーバーが合わなかったり遅いと感じた時は選び直してXREA内で移転できます。独自ドメインがあれば誰にも気づかれずにXREA内であちこち渡り歩けます(笑)。

さくらとはまた違う趣があると思いますが、bzbellさんなら使いこなせるんじゃないかな?
機能も豊富だし試す価値はあるんじゃないかなと。広告付いてよければそのまま無料スペースとしても確保しておけますし。

あれから見直してみるとどうやら外部ファイル化した時の記述がおかしかった箇所があって、そこをなおすと何とか表示できるようになりました!おさわがせしてすいません(^^ゞただ確定したわけでないのでもう少し見直していこうと思います。表示もまだ遅いようですし、ダイエットできる箇所があればまたやってみようと思います。

ところでキャッシュなのですが、「caching」と「conditional」の意味はわかったのですが、これって2つ入れても問題ないものでしょうか。というか2つ入れるのって意味あることでしょうか。

>スメルチさん
頁、表示されるようになりましたか! よかったですね。

キャッシュですが、2つ同時に使ったことがないので何とも言えませんが、それで問題ないようならいいんじゃないでしょうか。私は頁分割を取り入れているので「ページ・レベルのキャッシング」はオフにしています。
ちなみに「ページ・レベルのキャッシング」をオンにすると静的と動的の中間みたいな感じになります。再構築はしなくていいけど、動的ならではの恩恵にあずかれないので、意外に使い勝手がよくない。動的生成というよりは「再構築しなくていい静的生成」という感じですね。

なるほど、そういうことなのですね。

2ついれてても問題ないようなのですが、私も分割してるので片方だけにしてみます。

ありがとうございました!

先日は、大変お世話になりました。長い間の悩みが消えて、ほっとしている毎日です。
まだまだよくわかっていないので、この記事に関する意味もわからない部分も多いのですが、じっくり考えてみたいと思っています。

>単なる飾りやエフェクト効果だけなら、なくてもかまわないですよね。見かけのかっこよさではなく、中身で勝負しましょう!

なんか頭痛いです。ほんとその通りでした。
見かけの華やかさにとらわれるタチの私には、考えさせられる言葉です。中身で勝負できるようにがんばります。
これからもよろしくお願いいたします。

>スメルチさん
サクッと表示される時はされるようなので、条件付きリクエストでいいと思います。
サーバー負荷を下げる効果もあるみたいですし。

>*miekoさん
こんにちは。ブログ紹介ありがとうございます。^^
*miekoさんのサーバーは1の条件を満たしているようですし、頁表示も速いので、これまでと同じように使われて何も問題ないと思います。
私こそ中身(色々な意味で^^;)で勝負できるように精進しなければ~です。
こちらこそこれからもよろしくお願い致します。