今まで使っていた CGI を動かすために、ActivePerl を動くようにします。これにちょっと時間がかかりました。
いろいろやってうまくいかなくて、ActivePerl も 32bit を入れたり、古いバージョンを入れたり、IIS を入れなおしたりといろいろ苦労しました。
で、結局、ActivePerl が悪いわけではなく、Apache と IIS の CGI を呼び出すときのカレントディレクトリの場所が違うことが問題でした。
Apache は CGI のスクリプトがある場所をカレントディレクトリにして perl を呼び出します。で、使っていたスクリプトのほとんどがこれを前提にしていました。追加のモジュールや、ファイルの読み書きもカレントディレクトリ下のファイルとして読み書きしていました。
IIS は CGI スクリプトを呼び出すときにカレントディレクトリをスクリプトの場所に変えないようです。それでモジュールが見つからなかったり、ファイルが読めなかったりしてエラーになって動きませんでした。結局、スクリプトを少々書き換えることで対応することにしました。
では、ActivePerl をインストールし、IIS を設定します。
まず、
ActivePerl のサイトから 64bit の最新版の "ActivePerl-5.10.0.1004-MSWin32-x64-287188.msi" をダウンロードしました。C:\Perl64 にインストールされました。
次に、IIS マネージャでサイト上の CGI を置く場所を右クリックして "アプリケーションの変換" を選びます。そして、変換したフォルダのハンドラマッピングを開き、右側の "スクリプトマップの追加" をクリックします。
出てきたダイアログで、
要求パス: *.cgi
実行可能ファイル: C:\Perl64\bin\perl.exe "%s" %s
名前:CGI
と設定します。これで、拡張子が .cgi のときに perl で処理するようになります。
カレントディレクトリの問題は、スクリプトを少々書き換えます。
IIS から呼ばれる CGI の先頭に
chdir "スクリプトのあるパス";
use lib "スクリプトのあるパス";
を追加することで動くようになります。たとえばスクリプトが C:\html\cgi-bin\blog にあるとしたら、
chdir "c:/html/cgi-bin/blog/";
use lib "c:/html/cgi-bin/blog/";
とします。全てのスクリプトの変更の必要はありません。IIS から呼ばれるものだけ(urlに使われるものだけ)で十分です。
とりあえず今使っているこのブログや掲示板、アクセスカウンタはこれで動くようになりました。