さくらインターネットで Movable Type のダイナミックパブリッシングによる500エラーを確実に解消する方法
さくらインターネットで Movable Type のダイナミックパブリッシングによる500エラーを解消する方法をまとめましたので、本エントリーにて情報展開致します。
さくらインターネット+ダイナミックパブリッシング+500エラーの解消方法は、色々なサイトで公開されているのですが、サイトパスの設定によって500エラーが解消されないケースがあったため、改めて調査を行い、どのような設定を行なっても確実に500エラー解消する方法を網羅しました。
また、他のサイトでは500エラーを解消するための対処方法として冗長な情報も紛れ込んでいると思われるため、本エントリーでは正常に動作させるための最小限の方法のみ紹介し、それ以外の変更の要否については、5項にFAQとしてまとめてみました。認識誤りがありましたらご指摘ください。
動作を確認したプランは、さくらインターネット「レンタルサーバ」の「スタンダード」プランおよび「マネージドサーバ」です。Movable Typeのバージョンは5.02で確認しましたが、MT4.xでも同様の対処で解消すると思われます。
1.問題点
さくらインターネットのスタンダードプランやプレミアムプランを利用している場合、ダイナミックパブリッシングを設定し、設定後にダイナミックパブリッシング対象のページにアクセスすると、次のような500エラーが発生します。
2.原因と対処(その1:.htaccessの修正)
1つの原因は、多くのサイトで言及されていますが、ダイナミックパブリッシングを設定した際に生成される .htaccess というファイルの中にある4行目のOptionsディレクティブ(赤色部分)がさくらインターネットでサポートされていないためです。
## %%%%%%% Movable Type generated this part; don't remove this line! %%%%%%%
# Disable fancy indexes, so mtview.php gets a chance...
Options -Indexes +SymLinksIfOwnerMatch
<IfModule mod_rewrite.c>
…後略…
エラーログを確認すると、次のような1行が表示されているので、このことより上記の原因であることが分かります。
/home/xxx/www/mt/.htaccess: Options not allowed here
対処方法は、FFFTPなどのFTPツールで、このファイルをローカルPCにダウンロードして、任意のエディタで開き、この1行を削除する(対処1-1)か、あるいはOptionsディレクティブの行頭に半角の「#」をつけてコメントアウトします(対処1-2)。編集後、同じディレクトリにアップロードしてください。
対処1-1
## %%%%%%% Movable Type generated this part; don't remove this line! %%%%%%%
# Disable fancy indexes, so mtview.php gets a chance...
<IfModule mod_rewrite.c>
…後略…
対処1-2
## %%%%%%% Movable Type generated this part; don't remove this line! %%%%%%%
# Disable fancy indexes, so mtview.php gets a chance...
#Options -Indexes +SymLinksIfOwnerMatch
<IfModule mod_rewrite.c>
…後略…
編集後、同じディレクトリにアップロードしてください。この対処方法は公式ドキュメントでも公開されています。
余談ですが、エラーログを参照する設定は、サーバコントロールパネルより、「アクセスログの設定」をクリックします。
そして、「アクセスログの保存設定」から「残す」を選択して、「エラーログも残す」をチェックします。
3.原因と対処(その2:ディレクトリのパーミッション修正)
2項の対処だけを行なっても500エラーが解消しない場合、もうひとつの原因は、ウェブサイトやブログのサイトパスとなるディレクトリのパーミッションです。
MTの管理画面でウェブサイトやブログのサイトパスを作成すると、そのディレクトリのパーミッションは「777」になります。さくらインターネットではsuexecを採用しており、「777」というパーミッションではother(1桁目)にwriteパーミッションがあるため、500エラーとなります。
エラーログを確認すると、次のような1行が表示されており、上記が原因であることが推測されます。
suexec policy violation: see suexec log for more details
suexecのログは確認していませんが、ネットで検索すると次の記事がありました。
対処方法は、ダイナミックパブリッシングを適用しているウェブサイトまたはブログの一番最後のサイトパスのパーミッションを「705」に変更します。
念のため、FFFTPを利用したパーミッションの変更方法を以下に掲載しておきます。
変更対象となるサイトパスの一番下位のディレクトリを右クリックして、「属性変更」を選択します。例えばサイトパスが /home/[ユーザ名]/www/foo となっている場合、fooディレクトリを選択します。
開いたダイアログで、ディレクトリのパーミッションを「705」に変更します。「755」でも問題ありません。
パーミッションを変更するディレクトリはこの部分のみです。それより上位のディレクトリのパーミッションを変更する必要はありません。また、/home/[ユーザ名]/www 直下をウェブサイトやブログのサイトパスにする場合、wwwのパーミッションが755になっていればこの作業は不要です。
また、ネット上でのsuexecの情報で「701」の設定が推奨されている場合もありますが、その設定ではスタイルシートファイルなどが参照できなくなったため、少なくともotherにリード権のある705に変更してください。
4.ダイナミックパブリッシングを利用するパスが複数ある場合
ウェブサイトとブログ、あるいは複数のブログでそれぞれダイナミックパブリッシングを行なっている場合は、2項と3項の対処についてそれぞれ実施してください。具体的には次の通りです。
- ウェブサイトのサイトパスにある.htaccessを修正し、ウェブサイトのサイトパスのパーミッションを変更
- 各ブログのサイトパスにある.htaccessを修正し、ブログのサイトパスのパーミッションを変更
またブログで、アーカイブをブログパスと別のパスで公開している場合も、アーカイブパスのディレクトリについて、2項と3項の対処を行なってください。
5.FAQ
ネット上でみつけた他の対処方法についての要/不要について、この項で見解を述べておきます。理解が間違っていたらご指摘ください。
Q:mtview.phpのパーミッションを変更する必要はありますか?
A:パーミッションを変更する必要はありません。705/755に変更してください。
ダイナミックパブリッシングを設定すると、サイトパス上にmtview.phpというファイルが生成されます。このファイルのパーミッションは644で生成され、「CGIと動作させるために755や705に変更してください」という情報がありましたが、す。特に変更する必要はありません。もしCGIとして動作させるために変更が必要なのであれば、MTのインストールディレクトリに含まれるPHPファイルのパーミッションをすべて変更しなければならなくなります。てください。
なお、mtview.phpおよびPHPファイルのパーミッションが644でも正常に動作することを確認しています。
いずれの場合も、mtview.phpが属するディレクトリのパーミッションも705/755に変更してください。777など、「グループ」「その他」のクラスに書き込み権があるパーミッションでは500エラーが発生します。
Q:templates_cやcacheというディレクトリのパーミッションの変更は必要ですか?
A:パーミッションを変更する必要はありません。
ダイナミックパブリッシングを設定すると、サイトパス上にtemplates_cというディレクトリが生成されます。また、キャッシュの利用を有効にすると、さらにcacheというディレクトリが生成されますが、これらのパーミッションは変更せずに表示されることを確認しています。
Q:ファイルの拡張子を.htmlから.phpに変更する必要はありますか?
A:拡張子を変更する必要はありません。
ダイナミックパブリッシングは.htaccessで制御し、通常の.htmlファイルをPHPとして動作させるため、拡張子を変更する必要はありません。
注:これらの見解について、Movable Type の環境変数はすべてデフォルトの状態で動作確認を行なっています。UploadPermsやUploadUmaskなど、環境変数の設定状況によってはこの限りでないかもしれません。
6.モジュール版での設定
これまでに説明した設定は、CGI版(PHPをCGIをして動作させる場合)での話です。
さくらインターネットでは、レンタルサーバの上位サービスの「ビジネスプロ」やマネージドサーバであれば、PHPの「モジュールモード(モジュール版)」が用意されています。このモードを利用する場合、2項の設定のみ行い、3項の設定は行なわなくても正常に動作するようです。
CGI版とモジュール版の違いについては以下の記事を参照してください。
7.「キャッシュ」または「条件付き取得」の併用
ダイナミックパブリッシングを利用する場合、サーバの負荷を軽減するために、「キャッシュ」または「条件付き取得」の併用を推奨します。
設定方法は、ダイナミックパブリッシングを設定したあと、「設定」→「全般」をクリックし、次の画面で「キャッシュする」または「条件付き取得を有効にする」をチェックします。
キャッシュをすることで、前回のアクセスから変更されていないページはキャッシュを利用します。条件付き取得は、HTTP 304応答を行ないます。詳細は下記のページを参照してください。
8.その他
スタティックパブリッシングからダイナミックパブリッシングに移行した場合、スタティックパブリッシングの設定時にすでに出力されていたページは、「.static」という拡張子をつけてリネームされます。
実験では、このファイルが残っていれば、3項の対処を行なわなくてもアクセスが可能な場合がありましたが(理由は不明)、ダイナミックパブリッシング設定後のブログ記事などは500エラーとなるので、必ず3項の対処を実施してください。
なお、「.static」という拡張子がついたファイルは再利用されることはありませんので、ディスクの容量削減のため、削除することを推奨します。
2010.09.01
FAQの記述を修正しました。
- Movable Typeのダイナミックパブリッシングで「An error occurs.」になる場合の対処
- MT::FileInfoについて
- ダイナミック・パブリッシングで perl のプラグインを利用する
- Movable Type の再構築を不要にする「ダイナミック・パブリッシング」(その2:設定方法)
- Movable Type の再構築を不要にする「ダイナミック・パブリッシング」(その1:概要)
初めまして!ここ数日、さくらインターネットで、mtのダイナミックパブリッシングが使えないことで悩み続けておりました。
こちらのサイトを参考にさせていただき、2.3を実行しましたが、500エラーは、消えませんでした。
そこで、mtview.phpのパーミッションを変更する必要はないとのことでしたが、705に変更したところ、解決されました。
ちなみに、使っているのはmt3.35です。
素人でよくわかりませんが、私が実践した内容だけお知らせさせていただきました。
また参考にさせてください。
ありがとうございました!
>*miekoさん
はじめまして。
ダイナミックパブリッシング、無事に動いたようでよかったです。
MT3の情報提供、ありがとうございました!
こんにちは。
私も、さくらインターネット「スタンダード」です。契約は、去年の秋にしました。
Movable Type Pro 5.02
月別ブログ記事リスト(月別アーカイブ)をダイナミックパブリッシングにしています。
mtview.php のパーミッションを 705 644 どちらも試してみましたが Internal Server Error は出ませんでした。普段は、さくらインターネットの PHP 推奨値である 705 にしています。
>日下部理恵さん
こんばんは。
コメント&情報ありがとうございました!
2つのディレクトリーのパーミッションですが、
templates_c 755
cache 777
これらは、MT が作ったもので、パーミッションには手を加えていません。
エラー無く動いています。
>日下部理恵さん
こんばんは。
こちらも情報ありがとうございました。
なお、mtview.phpのパーミッションについてはもう少し調べてみたいと思います。