IISでPerlが動かない場合の確認事項

この記事は2016年9月13日に最終更新したものです。
現在は状況が異なる可能性がありますのでご注意ください。

この記事が気に入った方は「いいね」してくださるとヾ(*≧∀≦)ノ゙ 嬉スィ~★♪です。

この記事を読むのに必要な時間は約 9 分です。

Perlで作られたCGIプログラムといえば元々はUNIX系に書かれたもので、IISでCGIが動かないという事例は意外と多いものです。

私もLinux系サーバーで動いたものをIISに移動して動かなくなり、毎度のように苦労しています。

もし動かない場合には、以下をチェックしてみて下さい。

①ハンドラーマッピングを再チェック

IISは実行ファイル毎に「ハンドラーマッピング」を追加することになっています。
ハンドラーマッピングとは、拡張子で示されるファイルに要求があった時、どのプログラムに処理を任せるかというマッピングのことです。

CGIなら「*.cgi」にPerlの実行パスを指定しなければ動きません。

Win32ではActiveState社のActivePerlが有名ですが、筆者はStrawberryPerl 64bit版を使用しています。

Strawberry Perlには予めCPANが組み込まれていますので、追加のモジュールが必要なときに威力を発揮します。

WindowsにはStrawberry Perlをオススメします。

まず、IISマネージャーを開きサーバー全体でCGIを使うなら左のペインで「サーバー名」をクリック。
目的のサイト内で使用するなら左のペインで「サイト名」をクリック。

ハンドラーマッピングをクリック。

ハンドラーマッピングにCgiModuleが入っていなければ(初期値)、スクリプトマップの追加をクリック。

要求パスに*.cgi
実行可能ファイルにperl.exe へのパスと %s %sを追記。
名前は覚えやすい名前を入れる。

C:\perl64\bin\perl.exe %s %s

次に「要求の制限」をクリック。


マップ、動詞、アクセスを順に設定。


ここまでがきちんと設定できていれば、原因は他にあります。

よくあるエラー

INTERNAL SERVER ERROR 500

多くは、パスの書き間違いです。
原因を探ることから始めましょう。

IISの場合、初期設定でエラーログはxmlファイルで保存されています。
場所はIISマネージャーの「失敗した要求トレースの規則」をクリック。

右上のトレースの表示をクリック。

エラーファイルをIEで開く。

+のアコーディオンを開く。

するとこんなログが見つかると思います。

指定された CGI アプリケーションは、正しく動作しませんでした。
HTTP ヘッダーの完全なセットが返されませんでした。
返されたヘッダーは "Can't locate ./lib/***.pl in @INC (@INC contains: C:/Perl64/site/lib C:/Perl64/lib .) at D:\usr\www\cgi-bin\****\***:*.cgi line 20.
" です。

これは指定されたディレクトリにモジュールが見つからないというエラーです。
この場合は下を読み飛ばしてへ進んでください。

②perlのパスはあっていますか?

cgiファイルの一行目にperl(perl.exe)へのパスがあります。
初期設定は

#!/usr/local/bin/perl

になっていると思いますが、これはUNIX系のパスですのでIISは修正する必要があります。
ご自分のサーバーに合っているかチェックしてください。

例)

#!C:\Perl\bin\perl

または

#!C:\Perl\bin\perl.exe

③IISの場合のおまじない

require ‘*****.pl’; require ‘******.cgi’ という文字列を探しましょう。
通常、cgiプログラムの最初のほうに書いてあります。
そのひとつ上の行に

$chdir = $0; 
$chdir =~ s/[^¥¥]*$//; 
chdir($chdir);

以上3行を書き加えてみてください。(カレントディレクトリ)

④実行フォルダの指定

cgiファイルの2行目付近に
chdir(カレントディレクトリ)を使用して実行cgiのフォルダの場所を明示的に示してやります。
もしもbbsというフォルダ内でのcgiを動かすなら「絶対パス」で指定します。

例)

chdir 'D:¥public_html¥wordpress¥wp-content¥cgi-bin¥bbs';

そして、
require’****.pl’;
require’****setting.cgi’;
等も「絶対パス」に書き換えます。

require 'D:¥public_html¥wordpress¥wp-content¥cgi-bin¥bbs¥****.pl';
require 'D:¥public_html¥wordpress¥wp-content¥cgi-bin¥bbs¥***setting.cgi';
絶対パスはエクスプローラーのアドレスバーを右クリックして取得できます。

よくあるエラー(Internal Server Error 500-502)「Can’t locate ./lib/***.pl ******`inc***at***line 20.」は、読んでお解りのように***.cgiで指定された20行目に***.plというモジュールが見つからないというエラーです。

***.plが下のようにrequire’****.pl’;で書いてあるとエラーになる場合があります。

#require $***.pl';  
require 'D:\usr\www\cgi-bin\bbs\lib\***.pl'; #絶対パスに書き換える

その場合、#でコメントしてその下に
require ’絶対パス’;で***.plの場所を正確に書き直しましょう。

⑤use を requireに書き換えてみる

私がハマったあるCGIでモジュール「Minimal.pm」を読み込めないというエラーが消えず、苦労しました。

useをrequireに変更したところ読み込めるようになりました。

◎変更前

use CGI::Minimal;

◎変更後

require 'D:\usr\www\cgi-bin\bbs\lib\CGI\Minimal.pm';

useとrequireの違いは、useはCGIを読み込む前に予め読み込みますが、requireは、その都度1回だけ読み込みます。

読み込めないモジュールをrequireに書き換えると直るかもしれません。

⑥その他

1)cgiの編集に用いたテキストエディタは文字コードと改行コードの指定できるものですか?
おすすめのエディタは、MKEditor です。
cgiに限らずサーバー上のファイルは文字コードと改行コードがポイントです。

2)perl.exeの環境変数へのパス(path)の登録は済んでいますか?
コントロールパネル➔システム➔システムの詳細設定➔環境変数に追記

;C:\perl64\bin\perl.exe