我想配置在Kubuntu
上运行的Apache 2来执行Perl CGI脚本。我尝试过谷歌搜索时遇到的一些步骤,但似乎没什么用。
实现这一目标的正确方法是什么?
答案 0 :(得分:23)
这篇文章的目的是拯救那些在Ubuntu上无法正确设置Apache2 for Perl的人。 (特定于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-you-your-.pl-and-.cgi-files ]。
使用.pl
授予chmod
文件的权限,然后在浏览器的地址栏中输入webaddress/cgi-bin/test.pl
,你去了,你得到了它。
(现在,在这篇文章中,许多事情都是多余的。请忽略它。)
答案 1 :(得分:19)
您需要查看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
标题和最后一个标题后面的空行。
答案 2 :(得分:13)
(即使我没有要求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/
落实到位。
答案 3 :(得分:5)
从Ubuntu 12.04(精确穿山甲)开始(也许还有一两个版本)只需通过Synaptic安装apache2
和mod-perl
并将您的CGI脚本放在/ usr / lib / cgi中-bin真的是你需要做的。
答案 4 :(得分:4)
如果您已成功安装Apache Web服务器和Perl,请按照以下步骤在ubuntu系统上使用perl运行cgi脚本。
在开始使用CGI脚本之前,必须以识别CGI目录(保存cgi程序的位置)的方式配置apache服务器,并允许在该目录中执行程序。
在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”。
如果没有发出以下命令以确保我们的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 webserver,以便它再次读取配置文件。
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 :(得分:2)
有两种方法可以处理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中的文件,而不适用于网站的所有文件。当然,AddHandler
或Directory
指令中的Location
也是如此。然后它应用于/ path / to / some / cgi-dir中的文件,以.pl
结尾。
答案 6 :(得分:1)
答案 7 :(得分:1)
对于像我这样的人,他们通过非常需要知道的权利现在的教程和文档来摸索你的方式,并且只是想看到那些适合初学者的东西,我发现了唯一的我必须做的是添加:
AddHandler cgi-script .pl .cgi
到我的配置文件。
http://httpd.apache.org/docs/2.2/mod/mod_mime.html#addhandler
对于我的情况,这是最好的,因为我可以将我的perl脚本放在我想要的任何地方,只需添加.pl或.cgi扩展名。
Dave Sherohman的回答还提到了AddHandler解决方案。
当然,您仍然必须确保正确设置脚本的权限/所有权,尤其是脚本可执行。记下&#34;用户&#34;是从http请求运行时 - 例如,www或www-data。