如何配置 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
也为我修复了它!这个答案真的值得更多的投票。
谢谢!我不敢相信我第一次找到的其他十几页从未提到过这个简单、小巧、重要的东西。
另外,在你的 如果您已成功安装 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 安装 apache2
和 mod-perl
并将 CGI 脚本放在 /usr/lib/cgi-bin 中即可需要做的。
【讨论】:
【参考方案6】:有两种处理 CGI 脚本的方法,SetHandler
和 AddHandler
。
SetHandler cgi-script
适用于给定context 中的所有文件,无论它们如何命名,甚至是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
或AddHandler
(和Options +ExecCGI
)时,它将全局应用于所有文件。但是您可以通过将这些指令包含在其中来将上下文限制为一个子集,例如Directory
<Directory /path/to/some/cgi-dir>
SetHandler cgi-script
Options +ExecCGI
</Directory>
现在SetHandler
仅适用于 /path/to/some/cgi-dir 内的文件,而不是网站的所有文件。当然,Directory
或 Location
指令中的 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 脚本?的主要内容,如果未能解决你的问题,请参考以下文章