1

Centos 5.11、Apache 2.2、およびデフォルトの perl を実行するサーバーがあります。suexec を介してスクリプトを実行すると「問題なく」動作しますが、perlbrew をインストールして、干渉することなく追加のモジュールをインストールできるようにしました。

テスト用の簡単な perl スクリプトを作成しました。

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "perl: ". $^X . "\n";

apache+suexec を実行すると、期待どおりに出力されます。

Hello, world! perl: /usr/bin/perl

しかし、シバン行を次のように変更すると:

#!/root/perl5/perlbrew/perls/perl-5.22.1/bin/perl

同じ方法で実行すると、内部サーバー エラーが発生し、Apache エラー ログに次のように表示されます。

suexec failure: could not open log file
fopen: Permission denied
Premature end of script headers: test.cgi

ただし、コマンド ラインでの実行は問題ありません。

# ./test.cgi 
Content-type: text/html
Hello, world!
perl: /root/perl5/perlbrew/perls/perl-5.22.1/bin/perl

私はあらゆる種類のことを試しました。「PATH」の問題なのかと思ったのですが、Apacheのドキュメントには「2.2では、Setenvを使用してPATH環境変数を設定できません」と書かれています。

通常、suexec エラーは dos/unix エンコーディングが原因のようですが、ここでは問題ではありません。

perlbrew のインストール方法に問題があるのでしょうか? 別のユーザーとして(apacheとして)する必要がありますか?別の場所 (/var/www の下)?

その他の提案は大歓迎です!

4

1 に答える 1

1

解決しました-あなたのナッジは私を正しい方向に導きました。

これは手がかりでした:

# suexec -V
 -D AP_DOC_ROOT="/var/www"
 -D AP_GID_MIN=100
 -D AP_HTTPD_USER="apache"
 -D AP_LOG_EXEC="/var/log/httpd/suexec.log"
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=500
 -D AP_USERDIR_SUFFIX="public_html"

ルートを変更して、perlbrew を再インストールしました。

# export PERLBREW_ROOT=/usr/local/bin/perlbrew
# perlbrew install perl-5.22.1

次に、スクリプトを次のように変更しました。

#!/usr/local/bin/perlbrew/perls/perl-5.22.1/bin/perl

そしてビンゴ:

こんにちは世界!パス: /usr/local/bin/perlbrew/perls/perl-5.22.1/bin/perl

于 2016-01-09T20:57:15.757 に答える