plenv + cpanmな環境でMovableTypeをPSGIで動かそうとしたのですが、
plackup mt.psgi
で起動した後、
ブラウザで mt.cgiにアクセスしたところ、
- mt.cgi → mt-upgrade.cgi にリダイレクト
- mt-upgrade.cgiが
DBD::mysql
を見つけられなくてエラー
という現象に遭遇しました。(starmanで起動しても同じエラー)
エラーメッセージを見てみると、@INC
がplenvのそれではなくsystem perlのデフォルトのライブラリパスになっていました。
plackupの-Iオプションでライブラリパスを指定しても、スクリプト内のuse libの引数をいじってみても効果なし。
原因はshebangでした。
2時間ほど格闘したあげく、原因がわかりました。
.cgiファイルのshebangが原因で、system perlの上で動いてしまっていました。
diff --git a/mt-upgrade.cgi b/mt-upgrade.cgi
index 8e3c540..70da90c 100755
--- a/mt-upgrade.cgi
+++ b/mt-upgrade.cgi
@@ -1,4 +1,4 @@
-#!/usr/bin/perl -w
+#!/usr/bin/env perl
# Movable Type (r) Open Source (C) 2001-2013 Six Apart, Ltd.
# This program is distributed under the terms of the
diff --git a/mt.cgi b/mt.cgi
index 20b6de9..198f88b 100755
--- a/mt.cgi
+++ b/mt.cgi
@@ -1,4 +1,4 @@
-#!/usr/bin/perl -w
+#!/usr/bin/env perl
一括で置換するにはこうすればOKです。
find . -name '*.cgi' | xargs perl -pi -e 's|#!/usr/bin/perl -w|#!/usr/bin/env perl|'
これで直りました。
~/.plenv/shims/plackupから起動してるんだから.cgiファイルのシェバンは無効だろうと思い込んでいたのですが、どうやらPSGIでcgiファイルを読み込むとシェバンが優先されてしまうようです。
PSGIの仕様なんでしょうか?