我如何configurationApache 2来运行Perl CGI脚本?

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

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

这篇文章是为了拯救那些在Ubuntu上无法正确设置Perl2的Apache2的人。 (特定于你的Linux机器的系统configuration将在方括号内提及,如[this])。

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

  1. 浏览器尝试下载.pl文件而不是执行并发出结果。
  2. 故宫。
  3. 内部服务器错误。

如果按照下面描述的步骤进行合理的情报处理,他/她可以解决上述错误。

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

 127.0.0.1 www.BECK.com 

第1步:安装apache2第2步:安装mod_perl第3步:configurationapache2

打开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添加到您的/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步:

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

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步

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

将以下内容添加到/etc/apache2/sites-enabled/000-default文件中

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

第七步:

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

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

(现在很多东西在这篇文章里都是多余的,请不要理睬)

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

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

  2. Apache仅configuration为从专用的cgi-bin目录运行CGI。 解决scheme:将CGI程序移到那里,或者向httpd.conf添加一个AddHandler cgi-script .cgi语句。

  3. CGI程序没有设置为可执行文件。 解决方法(假设一个* nixtypes的操作系统): chmod +x my_prog.cgi

  4. CGI程序正在退出而不发送标题。 解决scheme:从命令行运行程序,并validationa)它实际运行而不是死于编译时错误,b)它生成正确的输出,至less应包括一个Content-Type头,它的最后一个标题后面是一个空行。

(即使我没有要求perl,Googlesearch也给了我这个问题)

我遇到了运行脚本的问题(尽pipebash不是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/但都没有工作。

经过长时间的谷歌search会议什么对我来说破解是sudo a2enmod cgi和一切使用/usr/lib/cgi-bin/到位。

从Ubuntu 12.04 (Precise Pangolin)(也许是之前的一个或两个发行版)开始,只需通过Synaptic安装apache2mod-perl ,然后将CGI脚本放在/ usr / lib / cgi-bin中即可。

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

 SetHandler cgi-script 

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

 AddHandler cgi-script .pl 

是相似的,但适用于以.pl结尾的文件。 如果你愿意的话,你可以select另一个分机或多个分机。

此外,必须加载CGI模块并configurationOptions +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指令中也是一样的。 然后它应用于/ path / to / some / cgi-dir中的文件,以.pl结尾。

我猜你已经看了mod_perl ?

你有没有尝试过下面的教程 ?

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

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

在开始使用CGI脚本之前,需要configurationapache服务器,使其识别CGI目录(保存cgi程序的位置),并允许执行该目录下的程序。

  1. 在Ubuntu中,cgi-bin目录通常驻留在path/ usr / lib中,如果不存在,请使用以下命令创buildcgi-bin目录。 cgi-bin应该在这个path本身。

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

      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脚本执行的地方。 下一步是configurationapache来识别cgi-bin目录,并允许其中的所有程序执行为cgi脚本。

configurationApache使用Perl运行CGI脚本

  1. 需要在apache服务器的configuration文件中添加指令,以便知道CGI的存在及其目录的位置。 最初去Apache的configuration文件的位置,并用你最喜欢的文本编辑器打开它

     cd /etc/apache2/sites-available/ sudo gedit 000-default.conf 
  2. 将以下内容复制到代码行“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 
  3. 用下面的代码重新启动Apache服务器

     sudo service apache2 restart 
  4. 现在我们需要在默认情况下启用更新版本的ubuntu中的cgi模块

     sudo a2enmod cgi.load sudo a2enmod cgid.load 
  5. 在这一点上,我们可以重新加载Apache Web服务器,以便它再次读取configuration文件。

     sudo service apache2 reload 

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

testing一下

  1. 转到cgi-bin目录并创build一个扩展名为.pl的cgi文件

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

     #!/usr/bin/perl -w print “Content-type: text/html\r\n\r\n”; print “CGI working perfectly!! \n”; 
  3. 现在给test.pl执行权限。

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

  5. 如果你看到输出“CGI工作正常”,你已经准备好了。现在将所有程序转储到cgi-bin目录并开始使用它们。

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

对于像我这样一直在摸索自己的方式的人来说,通过比现在更需要知道的教程和文档,只想看看这个东西对于初学者来说是有用的,我发现我唯一拥有的东西要做的是添加:

AddHandler cgi-script .pl .cgi

到我的configuration文件。

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

对于我的情况,这是最好的,因为我可以把我的perl脚本,我想要的任何地方,只需添加.pl或.cgi扩展名。

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

当然,您仍然必须确保您的脚本的权限/所有权设置正确,特别是脚本将是可执行的。 记下从http请求运行的用户是谁,例如www或www-data。