Movable Type の再構築を不要にする「ダイナミック・パブリッシング」(その2:設定方法)
その2ではダイナミック・パブリッシングの具体的な設定方法を記します。前提条件を満たしていれば、さほど難しい設定はありません。
1.ダイナミック・パブリッシングの条件
1.1 データベース
まず、使用データベースに
- MySQL
- PostgreSQL
- SQLiteバージョン2
が利用されていることが必要です。
もし BerkeleyDB や SQLite を利用されているのであればデータベースの移行が必要になります。データベース移行については下記の記事が参考になるでしょう。
1.2 HTTPサーバ
.htaccess が利用できる必要があります。レンタルサーバであれば大体利用できる設定になっていると思いますが、自宅サーバで Apache をご利用であれば httpd.conf に以下のような記述を追加します。ディレクトリはご自身の環境にあわせてください。
リスト1 httpd.conf
<Directory /usr/local/apache/htdocs/mt>
AllowOverride All
</Directory>
IISをお使いの場合は、403と404のエラーに対して、mtview.phpへのURLを設定してください(とマニュアルに記載されています)。
2.ダイナミック・パブリッシングの設定方法
2.1 再構築オプションの変更
Movable Type の管理画面から[設定]-[公開]の「公開」欄にある「再構築オプション」から下記のいずれかを選択し、「変更を保存」をクリックします。
「アーカイブのみダイナミック・パブリッシングで出力します」を選択
「テンプレート別に、スタティックHTMLもしくはダイナミック・パブリッシングを選択します」を選択
なお、1.2項で説明した .htaccess は、上記を選択し「変更を保存」をクリックした時点で生成されます。
後者を選択した場合は、さらに各テンプレートの編集ページで「このテンプレートをダイナミック・ページにする」のチェックボックスをチェックします。チェックして保存すると、そのテンプレートがダイナミック・パブリッシングの対象になり、再構築ボタンが非表示になります。 |
インデックス・テンプレートはスクリーンショットのような選択画面が表示されますので、「このテンプレートをダイナミック・ページにする」にチェックをして保存すれば、下の「インデックス・テンプレートを再構築するときに、このテンプレートを自動的に再構築する」のチェックボックスは非表示になります。 |
2.2 テンプレート・キャッシュ・ディレクトリの作成
ブログのルート・ディレクトリに templates_c
という名前で新しいディレクトリを作成し、パーミッションを777に設定します。ディレクトリを作成しないとページが正常に表示されません。
3.ダイナミック・パブリッシングの最適化
以下の設定を行うことでダイナミック・パブリッシングを最適化します。
3.1 ページ・レベルのキャッシング
その1で説明した通り、Movable Type ではページのキャッシュ機能があります。この機能を利用すれば、あるページに対するリクエストで、そのページがファイルとしてキャッシュされます(ファイル名は外部から認識できない文字列)。
キャッシングを有効にするには、ブログのルート・ディレクトリに cache
という名前のディレクトリを作成し、パーミッションを777に設定します。
次に、Dynamic Site Bootstrapperテンプレート(mtview.php)に青色の行を加えます。
リスト2 Dynamic Site Bootstrapperテンプレート
<?php
include('<$MTCGIServerPath$>/php/mt.php');
$mt = new MT(<$MTBlogID$>, '<$MTConfigFile$>');
$mt->caching =true;
$mt->view();
?>
設定後、保存・再構築します。
これを利用すれば、(多分)テンプレートの内容が変更されるまでこのキャッシュが利用されるので、スタティック・パブリッシングに近いスピードでページにアクセスすることができます。
キャッシュを利用することでディスクは消費しますが、パフォーマンスは向上します。キャッシュはサーバの環境にあわせて利用を検討してください。個人的にはディスクの余裕があれば利用されることを推奨します。
3.2 条件付きリクエスト
ページ・レベルのキャッシングと排他的に利用すると思われるのが、この「条件付きリクエスト」です。機能としては、ページに変更がない状態でリクエストを受け付けた場合、304 Not Modified(サーバ上のファイルの変更がないためブラウザのキャッシュを用いることを示す)を返却します。
この設定を行うには、Dynamic Site Bootstrapperテンプレート(mtview.php)に青色の行を加えます。
リスト3 Dynamic Site Bootstrapperテンプレート
<?php
include('<$MTCGIServerPath$>/php/mt.php');
$mt = new MT(<$MTBlogID$>, '<$MTConfigFile$>');
$mt->conditional =true;
$mt->view();
?>
設定後、保存・再構築します。
ダイナミック・パブリッシングを行うか、304 を返却するかの元情報は、ブログのコメント・トラックバック・テンプレート等のタイムスタンプを利用しているようです。
参考:Movable Type 3.3 マニュアル - ダイナミック・パブリッシング
- Movable Typeのダイナミックパブリッシングで「An error occurs.」になる場合の対処
- さくらインターネットで Movable Type のダイナミックパブリッシングによる500エラーを確実に解消する方法
- MT::FileInfoについて
- ダイナミック・パブリッシングで perl のプラグインを利用する
- Movable Type の再構築を不要にする「ダイナミック・パブリッシング」(その1:概要)
≫ MTのダイナミックパブリッシングについて from ダラダラブログ
毎度お世話になってる「小粋空間」さんのところでMT3.3のダイナミックパブリッシ... [続きを読む]
≫ MT 自宅サーバへの移転 from juyama.net
このブログはMT(MovableType)で構築しています。以前はレンタルサーバ... [続きを読む]
≫ MT 自宅サーバへの移転と各種設定 from juyama.net
このブログはMT(MovableType)で構築しています。以前はレンタルサーバ... [続きを読む]
≫ ダイナミック・パブリッシングに対応しました from えぬぱすどっとねっと
焼です。どうもMovableType4では再構築時にヘッダエラーが出て色々調べて... [続きを読む]
こんにちは。
ダイナミック・パブリッシングを取り上げて下さってありがとうございます。
私もスタティックに比べてダイナミックの認知度が低いのではないかという懸念を持っていましたので、これを機にもっとダイナミック・パブリッシングが広がっていってくれたらいいなと思います。
ページ・レベルのキャッシングですが、ダイナミック用の頁分割とは相性がよくないようです。キャッシングを使うと頁分割が正常に機能しないという話を聞いていますので、ダイナミックで頁分割をする場合はキャッシング機能は使わない方がよいようです。
>TAEKOさん
こんにちは。
コメント&情報ありがとうございました。
色々参考にさせて頂くと思いますが、どうぞよろしくお願い致します。
少々ダイナミックパブリッシングについてお聞きしたいことがありましたのでこの場で質問させていただきたいと思います。
ご説明どおりに
2.1 再構築オプションの変更
2.2 テンプレート・キャッシュ・ディレクトリの作成
とやりました。ためしにメインページをダイナミックに変えてみましたら、index.htmlが消えてしまいアクセスしても何も表示されなくなってしまいました。エラー画面が出るのではなくただ真っ白なページになってしまいます。
データベースはMySQLですし、.htaccessもしっかり設定ファイルに書き込みました。templates_cのパーミッションも777です。今はスタティックに戻しておりますが毎回毎回再構築を行うのが面倒なので出来ればダイナミック・パブリッシングで運用していきたいと考えております。
どのあたりが問題か、分かりませんでしょうか?
分かりにくい文で申し訳ありませんがよろしくお願いします。
>およよさん
こんばんは。
ご質問の件ですが、
http://www.koikikukan.com/archives/2007/05/10-015037.php#c10613
の内容に該当していないでしょうかご確認ください(今のところ思い当たる情報はそれだけです)。
それではよろしくお願い致します。
横から失礼します
:::ダイナミック・パブリッシング時にページが真っ白になる件:::
私もこれにどハマりました。およよさん、以下の点を確認してみてはいかがでしょうか?
・ mod_rewrite.so が有効になっているかどうか
→ http://komitsudo.blog70.fc2.com/blog-entry-58.html
・ phpからDBに接続するモジュールがインストールされているかどうか
→ DBがPostgreSQLの場合、php-pgsql がインストールされているか
DBがMySQLの場合、php-mysqlがインストールされているか
私は後者の方(phpからDBにアクセスするモジュールがなかった)でひっかかって、まる1日悩みました。解決の糸口になれば良いのですが・・・。
>ぱえりあさん
こんにちは。
ご返事遅くなりましたが、アドバイスありがとうございました!