Win32環境でApache上にMovable Typeの環境を構築する場合、CGIプログラムをどのように実行させるかによって、いくつかの設定方法が存在します。
最近オールインワンのMTOS環境であるInstaMTがリリースされ、設定を意識せずMTOSの実行環境が手に入るようになりましたが、すでにApacheやActivePerlなどをインストールしている場合、オールインワンであることを余計に感じることもあるかと思います。
そこで今回、Win32版Apache上でMovable TypeをはじめとするPerl/CGIの実行環境についてまとめておきたいと思います。
- そもそもなんで簡単に動かないのか?
-
根本的な原因は「スクリプト1行目(shebang行)で指定されているPerlのパスが異なるため」に集約されます。
Win32版ApacheはUNIX版との互換性を保つため、CGIプログラムの実行時、スクリプト1行目に記載されているインタープリタのコマンドラインを取得し、このコマンドラインにスクリプト自身のパスを渡します。
具体的には対象となるCGIプログラムの先頭2バイトが「#!」であればこの挙動となります。IISでは基本的に拡張子ごとにコマンドラインを指定します(スクリプトマップ)ので、こういった問題は発生しません。
Movable TypeではUNIX処理系の一般的なPerlのパス(/usr/bin/perl)を記載していますが、Windows版のPerlのパス(C:/Perl/bin/perl.exe 等)とは異なっているため、Win32版Apacheではスクリプトを処理するインタープリタが見つからず、なんらかの対策を行わない限り実行できないようになっています。
この事情を踏まえて、その設定方法をいくつか挙げていきます。
- 方法1「スクリプトを書き換える」
-
MTではCGIプログラムとして実行されるスクリプトの拡張子を cgi に限定していますので、拡張子 cgi のファイルを開き、スクリプト1行目に記載されているPerlのパスをお使いのPerlのパスに書き換えます。
ただしmt-config.cgiはCGIとして実行されませんのでこの作業は不要です。
InstaMTではこの方法を採用しています。例えばお使いのPerlのパスが「C:\Perl\bin\perl.exe」である場合
#!/usr/bin/perl -w
を
#!C:/Perl/bin/perl -w
と変更します。
MT4.1の配布パッケージに含まれる拡張子cgiのファイルは
mt.cgi
mt-add-notify.cgi
mt-atom.cgi
mt-check.cgi
mt-comments.cgi
mt-feed.cgi
mt-search.cgi
mt-tb.cgi
mt-testbg.cgi
mt-upgrade.cgi
mt-wizard.cgi
mt-xmlrpc.cgiこの12個です(extrasフォルダのものは含みません)。
ただしプラグインによっては別途cgiファイルをインストールすることがありますので、念のため全cgiファイルを検索してみるとよいでしょう。この方法の長所としては
- cgiファイルの編集だけでよい
一方、短所としては
- MTのアップデート・インストールのたびに編集する必要がある
- MT以外のPerl/CGIもほとんどの場合編集が必須となる
となります。
- 方法2「Perlのパスを変更する」
-
スクリプト側の編集を行わずにCGIプログラムを実行させるには、スクリプト1行目のPerlのパスに現実にPerlが存在する必要があります。
そこで実際にスクリプト1行目に記載されているパスにPerlを配置します。MTで指定されているPerlのパスは「/usr/bin/perl」です。
Win32版Apacheにとって、このパスがどこになるのか・・・ということですが、Apacheはhttpd.confで指定されている ServerRoot をカレントディレクトリとして起動しています。
そのため(ServerRootのドライブ名):/usr/bin/perl.exe
がPerlの配置先となります。
理想的にはこの位置にperl.exeが配置されるようにPerlのパッケージをインストールすることになりますが、多くの場合その必要はありません。
ActivePerlなどのパッケージを既にインストールしている場合には、インストール先のbinディレクトリにあるperl.exeとperl58.dllの2つを「(ServerRootのドライブ名):/usr/bin/」にコピーします(ショートカット不可)。コピー先のディレクトリが存在しない場合にはディレクトリを作成します。
※perl58.dllはPerl5.8.xでのファイル名であり、バージョンによりファイル名が異なります
実はこの2つのファイルがあればperl.exeは実行可能です。
しかしながらこの状態では一切のモジュールがない状態になりますので、perl.exeに既存のライブラリパスを指定する必要があります。そこで環境変数PERL5LIBの設定を行います。
この環境変数はhttpd.conf/.htaccessで設定する必要があります。Win32版ではsuEXEC環境を考慮する必要がありませんので、SetEnvの利用に大きな問題はありません。SetEnv ディレクティブ
例えばActivePerlをC:/Perlにインストールしていた場合にはhttpd.conf/.htaccessに
SetEnv PERL5LIB C:/Perl/site/lib;C:/Perl/lib
の1行を追加します。
この方法の長所としては
- MT本体に一切手を入れなくてもよい
短所としては
- Perlの実行ファイルをコピーしなければならない
となります。
ジャンクションを用いた実現について:
すでにインストール済みのPerlを、都合のよい位置にあるように扱いたい場合、UNIX処理系ではシンボリックリンクを作成するという簡単な解決策があります。
WindowsでもNTFSファイルシステムに限定はしているもののリパースポイント(再解析ポイント)を使ってシンボリックリンクと同様の仕組みであるジャンクションを作成することが可能です。
例えばC:/Perl/bin/perl.exeをC:/usr/bin/perl.exeと見せかけたい場合、C:/PerlにリンクするC:/usrというジャンクションを作成することで、C:/Perl以下にあるファイルをC:/usr以下のファイルとしても扱えるようになります。
しかしながら、この機能は管理者向けとして扱われており、簡単に使うべきではありません。 - 方法3「拡張子ごとに処理アプリケーションを指定する」
-
Win32版Apacheは、IISのように拡張子に応じてコマンドラインを指定することを可能とする仕組みを持っています。
ScriptInterpreterSource ディレクティブ
ここではApache2.0以降から利用可能となったオプション「Registry-Strict」を利用します。
レジストリの設定が必要となりますので、敷居は高いですが、有効な方法です。まずは拡張子cgiを処理するインタープリタを指定するためのテキストファイルを作成します。
例えばActivePerlをC:/Perlにインストールしていた場合にはWindows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.cgi]
@="Perl"
[HKEY_CLASSES_ROOT\Perl\Shell]
[HKEY_CLASSES_ROOT\Perl\Shell\ExecCGI]
[HKEY_CLASSES_ROOT\Perl\Shell\ExecCGI\Command]
@=C:\\Perl\\bin\\perl.exe \"%1\"最後の行はPerlのパスに応じて適宜書き換える必要があります。
このテキストを拡張子regとなる任意のファイル名で保存します。
そして保存したファイルをレジストリエディタで開くことで値がインポートされます。次にhttpd.conf/.htaccessに
ScriptInterpreterSource Registry-Strict
の1行を追加します。
ScriptInterpreterSourceディレクティブはApache1.3.6以降で利用可能となっていますが、オプション「Registry」は基本的に使うべきではありません。
「Registry」の設定は通常の関連付け(サブキーShell/Open/Command)も参照するためです。
参照するレジストリのサブキーShell/ExecCGI/CommandはApache独自の拡張であり、「Registry-Strict」ではこのサブキーのみを参照するため、比較的安全に運用することが可能となります。長所としては
- MT本体に一切手を入れなくてもよい
- 環境変数も考えなくてよい
短所としては
- レジストリを使うため設定を誤るとシステムそのものに影響してしまう
- レジストリの管理が面倒
- 他アプリケーションからの関連付けによって設定が変更される恐れがある
となります。
個人的には、方法2を使っています。
仕事柄テスト環境を構築することが多いので、MTのファイルを編集することなく、一度Perlの準備さえしてしまえば、あとはApacheの設定ですべての設定が完結することがその大きな理由です。
これらの方法を、目的に応じて使い分けるのがよいかと思います。