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

时间:2009-02-18 11:50:31

标签: linux perl apache cgi

我想配置在Kubuntu上运行的Apache 2来执行Perl CGI脚本。我尝试过谷歌搜索时遇到的一些步骤,但似乎没什么用。

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

8 个答案:

答案 0 :(得分:23)

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

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

  1. 浏览器尝试下载.pl文件,而不是执行并发出结果。
  2. 禁止。
  3. 内部服务器错误。
  4. 如果按照下面描述的步骤进行合理的情报,他/她可以解决上述错误。

    开始之前。转到/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-you-your-.pl-and-.cgi-files ]。

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

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

答案 1 :(得分:19)

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

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

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

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

  4. 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安装apache2mod-perl并将您的CGI脚本放在/ usr / lib / cgi中-bin真的是你需要做的。

答案 4 :(得分:4)

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

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

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

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

     ls -l /usr/lib | less
    
  3. 如果是,请检查权限是否为“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
    
    1. 授予cgi-bin目录的执行权限

       sudo chmod 755 /usr/lib/cgi-bin
      
    2. 因此你的cgi-bin目录已准备就绪。这是您放置所有cgi脚本以供执行的地方。我们的下一步是配置apache来识别cgi-bin目录,并允许以cgi脚本的形式执行其中的所有程序。

      使用perl配置Apache运行CGI脚本

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

        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 webserver,以便它再次读取配置文件。

        sudo service apache2 reload
        
      6. apache的配置部分已经结束了,让我们使用示例cgi perl程序进行检查。

        测试

        1. 转到cgi-bin目录并创建扩展名为.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. 现在在您的网络浏览器http://Localhost/cgi-bin/test.pl

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

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

答案 5 :(得分:2)

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

SetHandler cgi-script

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

AddHandler cgi-script .pl

类似,但适用于在给定上下文中以.pl结尾的文件。如果您愿意,可以选择其他一个或多个分机。

此外,必须加载CGI模块并配置Options +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中的文件,而不适用于网站的所有文件。当然,AddHandlerDirectory指令中的Location也是如此。然后它应用于/ path / to / some / cgi-dir中的文件,以.pl结尾。

答案 6 :(得分:1)

我猜你已经看过mod_perl了?

您是否尝试过以下tutorial

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

答案 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。