Kubuntu
PerlCGIスクリプトを実行するようにApache2を実行するように設定したいと思います。グーグルで出くわしたいくつかの手順を試しましたが、何も機能していないようです。
これを達成する正しい方法は何ですか?
この投稿は、*Ubuntu で Perl 用の Apache2 を適切にセットアップできないことに苦しんでいる人々を救うことを目的としています。(Linux マシンに固有のシステム構成は、[this] のように角括弧内に記載されます)。
Apache 2 のセットアップが不適切な場合に考えられる結果:
合理的な知性を持って以下に説明する手順に従えば、上記のエラーを乗り越えることができます。
手順を開始する前に。ファイルに移動し/etc/hosts
、IP アドレス / ドメイン名` を追加します。例:
127.0.0.1 www.BECK.com
ステップ 1: インストールapache2
ステップ 2: インストールmod_perl
ステップ 3: 構成apache2
以下を開いsites-available/default
て追加します。
<Files ~ "\.(pl|cgi)$">
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
Options +ExecCGI
PerlSendHeader On
</Files>
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory [path-to-store-your-website-files-like-.html-(perl-scripts-should-be-stored-in-cgi-bin] >
####(The Perl/CGI scripts can be stored out of the cgi-bin directory, but that's a story for another day. Let's concentrate on washing out the issue at hand)
####
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ [path-where-you-want-your-.pl-and-.cgi-files]
<Directory [path-where-you-want-your-.pl-and-.cgi-files]>
AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
AddHandler cgi-script .pl
Order allow,deny
allow from all
</Directory>
<Files ~ "\.(pl|cgi)$">
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
Options +ExecCGI
PerlSendHeader On
</Files>
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory [path-to-store-your-website-files-like-.html-(perl-scripts-should-be-stored-in-cgi-bin] >
####(The Perl/CGI scripts can be stored out of the cgi-bin directory, but that's a story for another day. Let's concentrate on washing out the issue at hand)
####
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ [path-where-you-want-your-.pl-and-.cgi-files]
<Directory [path-where-you-want-your-.pl-and-.cgi-files]>
AllowOverride None
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
AddHandler cgi-script .pl
Order allow,deny
allow from all
</Directory>
次の行をファイルに追加し/etc/apache2/apache2.conf
ます。
AddHandler cgi-script .cgi .pl
<Files ~ "\.pl$">
Options +ExecCGI
</Files>
<Files ~ "\.cgi$">
Options +ExecCGI
</Files>
<IfModule mod_perl.c>
<IfModule mod_alias.c>
Alias /perl/ /home/sly/host/perl/
</IfModule>
<Location /perl>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Location>
</IfModule>
<Files ~ "\.pl$">
Options +ExecCGI
</Files>
非常に重要、または少なくともそうだと思いますが、このステップを実行した後でのみ、機能するようになりました。
AddHandler cgi-script .cgi .pl
<Files ~ "\.pl$">
Options +ExecCGI
</Files>
<Files ~ "\.cgi$">
Options +ExecCGI
</Files>
<IfModule mod_perl.c>
<IfModule mod_alias.c>
Alias /perl/ /home/sly/host/perl/
</IfModule>
<Location /perl>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Location>
</IfModule>
<Files ~ "\.pl$">
Options +ExecCGI
</Files>
非常に重要、または少なくともそうだと思いますが、このステップを実行した後でのみ、機能するようになりました。
/etc/apache2/sites-enabled/000-default
以下をファイルに追加します
<Files ~ "\.(pl|cgi)$">
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
Options +ExecCGI
PerlSendHeader On
</Files>
ここで、Perl スクリプトを test.pl として、ステップ 3 で前述した場所に [ path-where-you-want-your-.pl-and-.cgi-files ] として追加します。
.pl
を使用してファイルにアクセス許可を付与し、ブラウザのアドレス バーに をchmod
入力します。webaddress/cgi-bin/test.pl
(さて、この投稿では多くのことが冗長になっているでしょう。無視してください。)
「内部サーバー エラー」の内容を確認するには、Apache エラー ログを確認する必要があります。私の経験では、最も可能性の高い 4 つのケースは次のとおりです。
CGI プログラムは、CGI の実行が有効になっていないディレクトリにあります。解決策: ExecCGI
httpd.conf または .htaccess ファイルを使用して、そのディレクトリにオプションを追加します。
Apache は、専用のcgi-bin
ディレクトリから CGI を実行するようにのみ構成されています。解決策: CGI プログラムをそこに移動するか、AddHandler cgi-script .cgi
ステートメントを httpd.conf に追加します。
CGI プログラムが実行可能に設定されていません。解決策 (*nix タイプのオペレーティング システムを想定):chmod +x my_prog.cgi
CGI プログラムはヘッダーを送信せずに終了しています。解決策: コマンド ラインからプログラムを実行し、a) コンパイル時エラーで停止するのではなく、実際に実行されること、および b) 正しい出力が生成されることを確認します。これには、少なくともContent-Type
ヘッダーと空白行が含まれている必要があります。最後のヘッダーに続きます。
(perlを求めなかったにもかかわらず、Google検索でこの質問にたどり着きました)
スクリプトの実行に問題がありました (perl ではなく bash ですが)。Apache には の構成がありましたが、ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
Apache エラー ログにはFile does not exist: /var/www/cgi-bin/test.html
.
両方にスクリプトを入れよう/usr/lib/cgi-bin/
としまし/var/www/cgi-bin/
たが、どちらも機能していませんでした。
長時間のグーグルセッションの後、私にとってそれをクラックしたのは
sudo a2enmod cgi
、/usr/lib/cgi-bin/
.
Ubuntu 12.04 (Precise Pangolin) (およびおそらく 1 つまたは 2 つ前のリリース) では、Synaptic を介してインストールし、CGI スクリプトを /usr/lib/cgi-bin に配置するだけでapache2
十分mod-perl
です。
CGI スクリプトを処理するには、2 つの方法がありSetHandler
ますAddHandler
。
SetHandler cgi-script
は、指定されたコンテキストindex.html
内のすべてのファイルに適用されますstyle.css
。
AddHandler cgi-script .pl
は似ていますが.pl
、特定のコンテキストで , で終わるファイルに適用されます。必要に応じて、別の拡張機能または複数の拡張機能を選択できます。
さらに、CGI モジュールをロードしてOptions +ExecCGI
構成する必要があります。モジュールを有効にするには、次を発行します。
a2enmod cgi
Apache を再起動またはリロードします。最後に、Perl CGI スクリプトは実行可能でなければなりません。したがって、実行ビットを設定する必要があります
chmod a+x script.pl
そして、それはで始まる必要があります
#! /usr/bin/perl
その最初の行として。
SetHandler
or AddHandler
(and ) をディレクティブの外で使用するOptions +ExecCGI
と、すべてのファイルにグローバルに適用されます。ただし、これらのディレクティブを内部で囲むことにより、コンテキストをサブセットに制限できます。Directory
<Directory /path/to/some/cgi-dir>
SetHandler cgi-script
Options +ExecCGI
</Directory>
SetHandler
Web サイトのすべてのファイルではなく、/path/to/some/cgi-dir 内のファイルにのみ適用されるようになりました。もちろん、 orディレクティブAddHandler
内でも同じです。次に、/path/to/some/cgi-dir 内のファイルに適用され、.Directory
Location
.pl
私のように、今すぐ知る必要があるよりもはるかに多くのチュートリアルやドキュメントを手探りしていて、初心者向けに機能することを確認したいだけの人のために、私が持っていた唯一のものを見つけました追加することでした:
AddHandler cgi-script .pl .cgi
私の設定ファイルに。
http://httpd.apache.org/docs/2.2/mod/mod_mime.html#addhandler
私の状況では、perl スクリプトを好きな場所に置き、.pl または .cgi 拡張子を追加するだけでよいので、これが最もうまく機能します。
Dave Sherohman の回答では、 AddHandler ソリューションについても言及しています。
もちろん、スクリプトの権限/所有権が正しく設定されていること、特にスクリプトが実行可能であることを確認する必要があります。http リクエストから実行する場合は、「ユーザー」が誰であるかをメモしておいてください (www または www-data など)。