IISでperlのCGIを動かそうとしてハマった話

例によってPCを新マシンに絶賛移行作業中で、既に沢山ハマっているのだが、今度はWindows10上のIISperlCGIを動かしていた環境を移行使用してまたハマったのでその件を記録としてここに残しておく。

 

まず、Windows10を新マシンにインストールした直後はIISが動いていないのでそれを動かす手順については以下の通り。

  1. スタートボタンから「Windows システムツール」>「コントロールパネル」を開く。
  2. 「プログラム」>「Windows の機能の有効かまたは無効化」をクリック。
  3. 表示されるダイアログ内で「インターネットインフォメーションサービス」と「インターネットインフォメーションサービスのホスト可能なWebコア」にチェックを入れる。
  4. 「インターネットインフォメーションサービス」の項内、「Worl Wide Web サービス」>「アプリケーション開発機能」>「CGI」にチェックを入れる。

とりあえずこれをすればIISCGIが使える準備が整う。

次にIISのマネージャパネルを開くがその手順は以下。

  1. [ Win+x ]を押して「コンピュータの管理」を選択。
  2. 「サービスとアプリケーション」>「インターネットインフォメーションサービス(IIS)マネージャ」を選択。

後はそのマネージャでドキュメントルートやCGIの設定を行う。例えば以下…

  1. 「接続」タブの「サーバ名」>「サイト」>「Default Web Site」を選択。
  2. 「操作」タブの「基本設定…」を押す。
  3. 「物理パス」にドキュメントルートのパスを入力して「OK」を押す。(デフォルトのドキュメントルートパスは「%SystemDrive%\inetpub\wwwroot」になっているハズ。)
  4. 「ハンドラーマッピング」をダブルクリック。
  5. 「操作」タブの「マネージドハンドラーの追加…」を押す。
  6. 要求パスに「*.cgi」、実行可能ファイルに「(perlのパス) "%s" %s」、名前に「CGI(任意の名前)」を入力して「OK」を押す。

で、これでperlCGIが動く準備は整ったハズなのだが、そう言えばperlをインストールしないといけなかった… と思い、旧PCと同様、Active Perl をあらためて新PCにもインストールすることにした。

旧PCのperlも Active Perl を使用していたので、まあ今回もそうするかと思い、ActiveStateのサイトに行き、Perlをインストール。

前回インストールしたのがもう4年前だったので細かいことは全然覚えていなかったが、4年前はサイト上で使いたいパッケージを選択すればインストールパッケージを作って貰えて、それをダウンロードしてインストールする、という感じだった気がしたが、今回は使いたいパッケージをサイト上で選択するのは同じだが、インストールはまずコマンドライン用のツールをダウンロード&インストールして、後はPC側でターミナルを開いてコマンドプロンプトにコマンドを入力して実行することでインストールされる仕様に変わっていた。

上記のスクリーンショットperl 5.28 になっているが、最新は5.38.2となっていて、最初はそれをインストールした。

で、インストール後にWindowsコマンドラインから実行してみるとサクッとperlは動いたのだが、実行ファイルがどこのパスにインストールされているのかがよく分からない。

以前は

c:\Perl64/bin/perl.exe

だったのだが、今回はそこでは無くなっていて、検索して探してみると

C:\Users\(ユーザ名)\AppData\Local\ActiveState\cache\(ハッシュ値?)\bin\perl.exe

という所になっていた。

なんだこれ… パスの途中に cache とか ハッシュ値的な文字列とか、気持ち悪くてしょうがない…

パッケージの内容を変更したり別のバーションをインストールするとこのハッシュ値っぽい文字列が異なるディレクトリにファイル類がインストールされる様だ。とにかく気持ち悪い…

と思いつつ、このパスをIISのマネージドハンドラのperlのパスとして設定してCGIにアクセスしてみると、アクセスの権限が無いという様なエラーが出る。(エラーコードは確か401.3だったかな。)

で、色々試しても中々上手くいかなかったが、perl.exe のアクセス権限で例えばEveryoneを追加してそれに「読み取りと実行」の権限を付けてみるとこのエラーは出なくなった。

が、今度は 502.2 のエラー(Bad Gateway)が出るようになった。

これも色々調べたり試したりしてみたが、そもそもコマンドラインCGIperlプログラムを実行してみても

Locale 'Japanese_Japan.932' is unsupported, and may crash the interpreter.

というのが最初に表示されている。

どうもこれがIISに返ることでBad Gateway が出てるのでは?と思ったが、このメッセージは perl に -X オプションを加えても表示が消えず、Bad Gateway も出続ける。

どうも perl が 5.38 だと出るけどそれ以前のバージョンだと出ないという情報もあった。

試しにもう一度ActiveStateのサイトに行き、今度は 5.28 をインストールし直してみたが、そうすると上記の Locale云々のエラーは出なくなったものの、Bad Gateway は出続けていた…

その後も色々調べたり試したりしたが、どうにも埒があかず、結局旧PCの C:\Perl64 以下を新PCにコピーしてIISperl も C:\Perl64\bin\perl.exe を使用するようにしたらあっさりCGIが動いた。

なのでちょっと負けた感がハンパ無いが、今回は一旦この対処で済ますことにする。