Windows+Apache+perlで #!/usr/bin/perl なCGIを動かす ― 2021-04-26 01:49
これまで、WindowsではActivePerlを使っていました。
でも今は Strawberry Perl のほうがいいみたいなので乗り換えました。
Perlのスクリプトのshebang行は通常
#!/usr/bin/perl
にしてますよね。Apacheはこれを読んで /usr/bin/perl を起動しようとするので、Windowsでもこのパスで perl.exe が起動するようにしないとCGIが動きません。
ActivePerlを使っていたときは、ActivePerlの bin フォルダにpathを通したうえで、ActivePerlの perl.exe を C:\usr\bin フォルダにコピーすればOKでした(コピーではなくシンボリックリンクでも良かったかも)。
しかし、Strawberry Perl ではそれではダメでした。C:\usr\bin に perl.exe をシンボリックリンクしてbash等から /usr/bin/perl script.pl を実行するとエラーなく動くのに、なぜかApacheでは 500 Internal Server Error になります。
で、いろいろ試行錯誤してたどり着いたのが、ApacheのScriptInterpreterSourceディレクティブを使うことでした。これはCGIファイルのshebang行(スクリプト先頭の#!で始まる行)を無視して拡張子のみ(.pl や .cgi)でスクリプトファイルを関連付け実行できるというものです。httpd.conf で対象ディレクトリに ScriptInterpreterSource registry を記述してみたら、無事、Apacheで#!/usr/bin/perlなCGIが動くようになりました。
めでたしめでたし
…が、以下の謎があります。
・ レジストリの設定も関連付けもしなくても動いちゃう。え?なんで?
・ C:\usr\bin\perl はやっぱり無いとダメ。なんで?
ま、動いてるから、いっか…
でも今は Strawberry Perl のほうがいいみたいなので乗り換えました。
Perlのスクリプトのshebang行は通常
#!/usr/bin/perl
にしてますよね。Apacheはこれを読んで /usr/bin/perl を起動しようとするので、Windowsでもこのパスで perl.exe が起動するようにしないとCGIが動きません。
ActivePerlを使っていたときは、ActivePerlの bin フォルダにpathを通したうえで、ActivePerlの perl.exe を C:\usr\bin フォルダにコピーすればOKでした(コピーではなくシンボリックリンクでも良かったかも)。
しかし、Strawberry Perl ではそれではダメでした。C:\usr\bin に perl.exe をシンボリックリンクしてbash等から /usr/bin/perl script.pl を実行するとエラーなく動くのに、なぜかApacheでは 500 Internal Server Error になります。
で、いろいろ試行錯誤してたどり着いたのが、ApacheのScriptInterpreterSourceディレクティブを使うことでした。これはCGIファイルのshebang行(スクリプト先頭の#!で始まる行)を無視して拡張子のみ(.pl や .cgi)でスクリプトファイルを関連付け実行できるというものです。httpd.conf で対象ディレクトリに ScriptInterpreterSource registry を記述してみたら、無事、Apacheで#!/usr/bin/perlなCGIが動くようになりました。
めでたしめでたし
…が、以下の謎があります。
・ レジストリの設定も関連付けもしなくても動いちゃう。え?なんで?
・ C:\usr\bin\perl はやっぱり無いとダメ。なんで?
ま、動いてるから、いっか…
Perl嫌い ― 2020-10-18 16:23
ヒマなのでWindowsにインストールしてあるActivePerlのバージョンを最新の5.28に上げたら既存のスクリプトが動かなくなったのでそっと5.16に戻した
Perlのこういうとこ嫌い
Perlに限った話じゃないけど
Perlのこういうとこ嫌い
Perlに限った話じゃないけど
最近のコメント