我想配置运行的 Apache 2Kubuntu
来执行 Perl CGI 脚本。我尝试了一些通过谷歌搜索遇到的步骤,但似乎没有任何效果。
实现这一目标的正确方法是什么?
这篇文章旨在拯救那些遭受*无法在 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 错误日志以了解“内部服务器错误”是什么。根据我的经验,最有可能的四种情况是:
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,谷歌搜索也让我想到了这个问题)
我在运行脚本时遇到问题(尽管 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/
.
如果您已成功安装 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 脚本执行。
使用 perl 配置 Apache 以运行 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
现在我们需要启用默认存在于较新版本的 ubuntu 中的 cgi 模块
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 working perfect”,您就可以开始了。现在将所有程序转储到 cgi-bin 目录并开始使用它们。
注意:不要忘记给你的新程序在 cgi-bin, chmod 755 权限,以便成功运行它而不会出现任何内部服务器错误。
从Ubuntu 12.04(Precise Pangolin)(可能是之前的一两个版本)开始,只需安装apache2
和mod-perl
通过 Synaptic 并将您的 CGI 脚本放在 /usr/lib/cgi-bin 中就可以了。
有两种方法可以处理 CGI 脚本,SetHandler
和AddHandler
.
SetHandler cgi-script
适用于给定context中的所有文件,无论它们如何命名,index.html
甚至style.css
.
AddHandler cgi-script .pl
类似,但适用于.pl
给定上下文中以 , 结尾的文件。如果您愿意,您可以选择另一个或多个扩展名。
此外,必须加载和Options +ExecCGI
配置 CGI 模块。要激活模块,请发出
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
仅适用于 /path/to/some/cgi-dir 内的文件,而不是网站的所有文件。当然,AddHandler
在Directory
orLocation
指令内部也是如此。然后它适用于 /path/to/some/cgi-dir 中的文件,以.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。