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

2024-10-17 08:47:00
admin
原创
91
摘要:问题描述:我想配置运行 Apache 2Kubuntu以执行 Perl CGI 脚本。我尝试了通过谷歌搜索找到的一些步骤,但似乎没有任何效果。实现这一目标的正确方法是什么?解决方案 1:这篇文章旨在拯救那些无法在 Ubuntu 上正确设置 Apache2 for Perl 的人。(特定于您的 Linux 机器...

问题描述:

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

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


解决方案 1:

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

Apache 2 设置不当可能导致的后果:

  1. 浏览器尝试下载.pl 文件而不是执行并给出结果。

  2. 禁止。

  3. 内部服务器错误。

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

在开始步骤之前。转到/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>

步骤4:

将以下行添加到您的/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>

步骤5:

非常重要,或者至少我是这样认为的,只有完成这一步之后,我才能让它工作。

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 ]。

.pl使用授予文件权限chmod,然后在浏览器的地址栏中键入webaddress/cgi-bin/test.pl,就这样,你就得到了它。

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

解决方案 2:

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

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

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

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

  4. CGI 程序退出时未发送标头。解决方案:从命令行运行该程序并验证 a) 它确实运行而不是因编译时错误而终止,以及 b) 它生成正确的输出,其中至少应包含标头Content-Type和最后一个标头后面的空白行。

解决方案 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/

解决方案 4:

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

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

  1. 在 Ubuntu 中,cgi-bin 目录通常位于路径 /usr/lib 中,如果不存在,请使用以下命令创建 cgi-bin 目录。cgi -bin应该位于这个路径本身中。

 mkdir /usr/lib/cgi-bin
  1. 发出以下命令来检查目录的权限状态。

 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
  1. 赋予cgi-bin目录执行权限

 sudo chmod 755 /usr/lib/cgi-bin

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

配置 Apache 使用 perl 运行 CGI 脚本

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

cd /etc/apache2/sites-available/ 
sudo gedit 000-default.conf
  1. 将以下内容复制到文件 000-default.conf 中的“DocumentRoot /var/www/html/”和“ErrorLog ${APACHE_LOG_DIR}/error.log”代码行之间

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
  1. 使用以下代码重新启动 apache 服务器

sudo service apache2 restart
  1. 现在我们需要启用 cgi 模块,该模块在较新版本的 ubuntu 中默认存在

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

sudo service apache2 reload

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

测试一下

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

cd /usr/lib/cgi-bin/
sudo gedit test.pl
  1. 将下面的代码复制到test.pl上并保存。

#!/usr/bin/perl -w
print “Content-type: text/html

”;
print “CGI working perfectly!! 
”;
  1. 现在授予test.pl执行权限。

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

  2. 如果您看到输出“CGI 工作正常”,那么您就可以开始了。现在将所有程序转储到 cgi-bin 目录中并开始使用它们。

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

解决方案 5:

从Ubuntu 12.04(Precise Pangolin)开始(可能还有之前的一两个版本),您只需通过 Synaptic 安装apache2并将mod-perl您的 CGI 脚本放在 /usr/lib/cgi-bin 中即可。

解决方案 6:

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

SetHandler cgi-script

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

AddHandler cgi-script .pl

类似,但适用于给.pl定上下文中以 结尾的文件。您可以根据需要选择其他扩展名或多个扩展名。

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

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 内的文件,而不是网站的所有文件。当然,或指令AddHandler内部也是如此。然后它适用于 /path/to/some/cgi-dir 内的文件,以 结尾。Directory`Location`.pl

解决方案 7:

我猜你已经看过mod_perl了?

您是否尝试过以下教程?

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

解决方案 8:

对于像我这样一直在摸索着学习比你现在需要知道的多得多的教程和文档,并且只是想看看这个东西对初学者有用的人来说,我发现我唯一需要做的就是添加:

AddHandler cgi 脚本 .pl .cgi

到我的配置文件。

http://httpd.apache.org/docs/2.2/mod/mod_mime.html#addhandler

就我的情况而言,这种方法最有效,因为我可以将我的 perl 脚本放在任何我想要的地方,只需添加 .pl 或 .cgi 扩展名即可。

Dave Sherohman 的回答也提到了 AddHandler 解决方案。

当然,您仍必须确保脚本的权限/所有权设置正确,尤其是脚本是否可执行。请注意从 http 请求运行时的“用户”是谁 - 例如 www 或 www-data。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   681  
  在项目管理领域,集成产品开发(IPD)流程以其高效、协同的特点,被众多企业视为提升产品竞争力的关键。IPD流程强调跨部门、跨职能的紧密合作,以确保产品从概念到市场各个环节的无缝衔接。然而,实现这一目标并非易事,它需要企业深刻理解并掌握IPD流程中的跨部门协作艺术。本文将深入探讨IPD流程中跨部门协作的三个关键点,旨在为...
IPD项目管理咨询   9  
  掌握IPD流程图:提升团队协作的关键路径在当今快速变化的商业环境中,团队协作的效率与效果直接关系到项目的成功与否。集成产品开发(Integrated Product Development,简称IPD)作为一种先进的研发管理理念,通过跨部门、跨领域的协同工作,能够显著提升产品开发的速度与质量。而IPD流程图,则是这一理...
IPD流程阶段   9  
  IPD流程概述:理解其核心价值与实施背景集成产品开发(Integrated Product Development,简称IPD)是一种先进的产品开发管理理念,它强调跨部门协作、市场导向和快速响应变化的能力。IPD流程不仅关注产品本身的技术创新,更注重将市场、研发、生产、销售等各个环节紧密集成,以实现产品从概念到市场的高...
华为IPD是什么   7  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程以其跨部门协作、高效决策和快速响应市场变化的特点,被众多企业视为提升竞争力的关键。然而,实践IPD流程并非易事,项目管理中的种种错误往往阻碍了其效果的充分发挥。本文旨在深入探讨如何在实施IPD流程时避免这些常见错误,...
IPD框架   7  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用