如何配置 Apache 2 以运行 Perl CGI 脚本?

Posted

技术标签:

【中文标题】如何配置 Apache 2 以运行 Perl CGI 脚本?【英文标题】:How do I configure Apache 2 to run Perl CGI scripts? 【发布时间】:2010-10-08 07:50:28 【问题描述】:

我想配置在Kubuntu 上运行的 Apache 2 来执行 Perl CGI 脚本。我尝试了一些通过谷歌搜索发现的步骤,但似乎没有任何效果。

实现这一目标的正确方法是什么?

【问题讨论】:

如果您链接到您已经尝试过的内容并说出无法使用的内容,这可能会有所帮助。 您在错误日志中收到了哪些错误消息?这些通常会告诉你什么是不正确的。 @cletus - 我有一堆旧的工作 cgi 脚本 - 它们工作正常,但是将它们放在不同的 Web 服务器上被证明是一个真正的痛苦。我不会把婴儿和洗澡水一起扔出去。这是一篇好文章 【参考方案1】:

这篇文章旨在拯救那些遭受*无法在 Ubuntu 上为 Perl 正确设置 Apache2 的人。 (特定于您的 Linux 机器的系统配置将在方括号中提及,例如 [this])。

不正确设置 Apache 2 的可能结果:

    浏览器尝试下载 .pl 文件,而不是执行并给出结果。 禁止。 内部服务器错误。

如果一个人以合理的智慧遵循以下描述的步骤,他/她可以克服上述错误。

在开始这些步骤之前。转到/etc/hosts文件并添加IP地址/域名`例如:

127.0.0.1 www.BECK.com

第一步:安装apache2 第二步:安装mod_perl 第三步:配置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>

第 6 步

非常重要,或者至少我猜是这样,只有在做了这一步之后,我才开始工作。

给你添加以下/etc/apache2/sites-enabled/000-default文件

<Files ~ "\.(pl|cgi)$">
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
Options +ExecCGI
PerlSendHeader On
</Files>

第 7 步:

现在将您的 Perl 脚本作为 test.pl 添加到您之前在第 3 步中提到的 [path-where-you-want-your-.pl-and-.cgi-files]。

使用chmod 授予.pl 文件的权限,然后在浏览器的地址栏中输入webaddress/cgi-bin/test.pl,就可以了。

(现在,这篇文章中的许多内容都是多余的。请忽略它。)

【讨论】:

一百万行只是为了运行 perl? 我不明白第 5 步和第 6 步。你解释说它“非常重要”。你给一个命令AddHandler cgi-script .cgi .pl。然后是一段代码。我们应该把它准确地放在哪里? 难道没有将.cgi 部署到另一种类型的服务器吗?喜欢puma :| 哇...这看起来很复杂。没有更简单的方法吗?看起来像重新发明***:(【参考方案2】:

您需要查看 Apache 错误日志以了解“内部服务器错误”是什么。根据我的经验,最有可能的四种情况是:

    CGI 程序位于未启用 CGI 执行的目录中。解决方案:通过 httpd.conf 或 .htaccess 文件将ExecCGI 选项添加到该目录。

    Apache 仅配置为从专用的 cgi-bin 目录运行 CGI。解决方案:将CGI程序移到那里或在httpd.conf中添加AddHandler cgi-script .cgi语句。

    CGI 程序未设置为可执行文件。解决方案(假设是*nix类型的操作系统):chmod +x my_prog.cgi

    CGI 程序正在退出而不发送标头。解决方案:从命令行运行程序并验证 a) 它实际运行而不是因编译时错误而死 b) 它生成正确的输出,其中至少应包括 Content-Type 标头和最后一个标题后有一个空行。

【讨论】:

非常感谢 :)..但是,我不得不在 /etc/apache2/sites-enabled/default 中进行更改,而不是 httpd.conf,然后一切正常...httpd.conf 是一个空白文件。为什么我不必在 httpd.conf 中进行更改? 处理配置的更“现代”方式是将所有内容放入一组部分配置文件(在启用站点、启用模块和 conf.d 中),以便程序可以更多地操作它们容易地。执行此操作时,不再需要 httpd.conf,可以使用也可以不使用。【参考方案3】:

(谷歌搜索让我想到了这个问题,即使我没有要求 perl)

我在运行脚本时遇到了问题(尽管 bash 不是 perl)。 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/ 一切就绪。

【讨论】:

谢谢,在 Debian 7 上你需要运行 a2enmod cgi 否则它将无法工作。 a2enmod cgi 也为我修复了它!这个答案真的值得更多的投票。 谢谢!我不敢相信我第一次找到的其他十几页从未提到过这个简单、小巧、重要的东西。 另外,在你的 添加 Options +ExecCGI AddHandler cgi-script .cgi .pl 也可以在这里看到:***.com/a/20473841【参考方案4】:

如果您已成功安装 Apache Web 服务器和 Perl,请按照以下步骤在 ubuntu 系统上使用 perl 运行 cgi 脚本。

在开始编写 CGI 脚本之前,需要配置 apache 服务器,使其能够识别 CGI 目录(保存 cgi 程序的位置)并允许在该目录中执行程序。

    在 Ubuntu 中,cgi-bin 目录通常位于路径 /usr/lib 中,如果不存在,则使用以下命令创建 cgi-bin 目录。cgi-bin 应该在此路径中。

     mkdir /usr/lib/cgi-bin
    

    发出以下命令检查目录的权限状态。

     ls -l /usr/lib | less
    

检查权限是否显示为“drwxr-xr-x 2 root root 4096 2011-11-23 09:08 cgi-bin”,如果是则转到步骤3。

如果不发出以下命令以确保我们的 cgi-bin 目录具有适当的权限。

     sudo chmod 755 /usr/lib/cgi-bin
     sudo chmod root.root /usr/lib/cgi-bin

    赋予cgi-bin目录执行权限

     sudo chmod 755 /usr/lib/cgi-bin
    

这样你的 cgi-bin 目录就可以使用了。这是您放置所有 cgi 脚本以供执行的地方。我们的下一步是配置 apache 以识别 cgi-bin 目录并允许将其中的所有程序作为 cgi 脚本执行。

配置 Apache 以使用 perl 运行 CGI 脚本

    需要在 apache 服务器的配置文件中添加一个指令,以便它知道 CGI 的存在及其目录的位置。最初转到 apache 配置文件的位置并使用您喜欢的文本编辑器打开它

    cd /etc/apache2/sites-available/ 
    sudo gedit 000-default.conf
    

    将以下内容复制到代码行“DocumentRoot /var/www/html/”和“ErrorLog $ APACHE_LOG_DIR/error.log”之间的文件000-default.conf中

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Require all granted
    

    使用以下代码重启apache服务器

    sudo service apache2 restart
    

    现在我们需要启用 cgi 模块,它默认存在于较新版本的 ubuntu 中

    sudo a2enmod cgi.load
    sudo a2enmod cgid.load
    

    此时我们可以重新加载 apache 网络服务器,以便它再次读取配置文件。

    sudo service apache2 reload
    

apache的配置部分已经结束了,现在让我们用一个示例cgi perl程序检查一下。

测试一下

    进入cgi-bin目录,创建一个扩展名为.pl的cgi文件

    cd /usr/lib/cgi-bin/
    sudo gedit test.pl
    

    将以下代码复制到test.pl并保存。

    #!/usr/bin/perl -w
    print “Content-type: text/html\r\n\r\n”;
    print “CGI working perfectly!! \n”;
    

    现在给 test.pl 执行权限。

    sudo chmod 755 test.pl
    

    现在在您的网络浏览器中打开该文件http://Localhost/cgi-bin/test.pl

    如果您看到输出“CGI 运行良好”,您就可以开始了。现在将所有程序转储到 cgi-bin 目录并开始使用它们。

注意:不要忘记给你的新程序在 cgi-bin, chmod 755 权限,以便成功运行它而不会出现任何内部服务器错误。

【讨论】:

【参考方案5】:

截至Ubuntu 12.04(Precise Pangolin)(可能是之前的一两个版本)只需通过 Synaptic 安装 apache2mod-perl 并将 CGI 脚本放在 /usr/lib/cgi-bin 中即可需要做的。

【讨论】:

【参考方案6】:

有两种处理 CGI 脚本的方法,SetHandlerAddHandler

SetHandler cgi-script

适用于给定context 中的所有文件,无论它们如何命名,甚至是index.htmlstyle.css

AddHandler cgi-script .pl

类似,但适用于在给定上下文中以.pl 结尾的文件。如果您愿意,您可以选择另一个或多个扩展名。

此外,必须加载 CGI 模块并配置 Options +ExecCGI。要激活模块,请发出

a2enmod cgi

并重新启动或重新加载 Apache。最后,Perl CGI 脚本必须是可执行的。所以必须设置执行位

chmod a+x script.pl

它应该以

开头
#! /usr/bin/perl

作为它的第一行。


当您在任何指令之外使用SetHandlerAddHandler(和Options +ExecCGI)时,它将全局应用于所有文件。但是您可以通过将这些指令包含在其中来将上下文限制为一个子集,例如Directory

<Directory /path/to/some/cgi-dir>
    SetHandler cgi-script
    Options +ExecCGI
</Directory>

现在SetHandler 仅适用于 /path/to/some/cgi-dir 内的文件,而不是网站的所有文件。当然,DirectoryLocation 指令中的 AddHandler 也是如此。然后它适用于 /path/to/some/cgi-dir 中的文件,以 .pl 结尾。

【讨论】:

【参考方案7】:

我猜你看过mod_perl?

您尝试过以下tutorial吗?

编辑:关于您的发布 - 也许您可以在 .cgi 文件中包含代码示例。甚至前几行?

【讨论】:

是的,我已经安装了 libapache2-mod-perl2 ,但是当我尝试使用 localhost/cgi-bin/mypage.cgi 访问我的页面时,我得到一个“内部服务器错误” 所以也许 mypage.cgi 坏了?【参考方案8】:

对于像我这样一直在摸索你现在需要知道的教程和文档,并且只想看到适合初学者的东西的人,我找到了唯一的我必须做的是添加:

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。

【讨论】:

以上是关于如何配置 Apache 2 以运行 Perl CGI 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

以用户“apache”运行的 Perl 无法加载 DBD::mysql 而其他用户可以

如何在Windows上运行带CGI的便携式Perl?

如何在 localhost 中运行 perl 脚本?

CG插画师|概念设计师Erikas Perl作品欣赏

Apache

Apache 未在包含的 perl 脚本中执行“do”包含函数