Perl 作为cgi脚本运行Dancer2应用程序时HTTP 504网关超时

Perl 作为cgi脚本运行Dancer2应用程序时HTTP 504网关超时,perl,apache,cgi,dancer,Perl,Apache,Cgi,Dancer,我正在尝试使用Apache将Dancer2应用程序部署为cgi脚本。我遵循了作为cgi脚本运行的规则,但是当我尝试在浏览器中访问我的应用程序时,我得到了HTTP 504网关超时 我对PSGI/Plack的世界是全新的,所以我的诊断可能会有点偏差,但看起来就像是在我要求的时候 http:// 从远程主机,dispatch.cgi启动一台服务器,监听端口3000,然后坐在那里等待输入,直到请求超时。以下是我在Apache错误日志中看到的内容: [Mon Nov 04 09:44:32 2013] [

我正在尝试使用Apache将Dancer2应用程序部署为cgi脚本。我遵循了作为cgi脚本运行的规则,但是当我尝试在浏览器中访问我的应用程序时,我得到了HTTP 504网关超时

我对PSGI/Plack的世界是全新的,所以我的诊断可能会有点偏差,但看起来就像是在我要求的时候

http://

从远程主机,
dispatch.cgi
启动一台服务器,监听端口3000,然后坐在那里等待输入,直到请求超时。以下是我在Apache错误日志中看到的内容:

[Mon Nov 04 09:44:32 2013] [error] [client 128.117.20.57] [ip2map:30142]  core @2013-11-04 09:44:32> Registered Dancer2::Core::DSL__WITH__Dancer2::Plugin::Ajax=HASH(0x3414560) in /var/www/ip2map/public/../lib/ip2map.pm l. 3
[Mon Nov 04 09:44:32 2013] [error] [client 128.117.20.57] [ip2map:30142]  core @2013-11-04 09:44:32> Registered Dancer2::Core::DSL__WITH__Dancer2::Plugin::Ajax__WITH__Dancer2::Plugin::Database=HASH(0x3414560) in /var/www/ip2map/public/../lib/ip2map.pm l. 4
[Mon Nov 04 09:44:32 2013] [error] [client 128.117.20.57] >> Dancer2 v0.10 server 30142 listening on http://0.0.0.0:3000
[Mon Nov 04 09:44:32 2013] [error] [client 128.117.20.57] >> Dancer2::Plugin::Ajax (0.10)
[Mon Nov 04 09:44:32 2013] [error] [client 128.117.20.57] >> Dancer2::Plugin::Database (2.10)
[Mon Nov 04 09:45:32 2013] [warn] [client 128.117.20.57] Timeout waiting for output from CGI script /var/www/ip2map/public/dispatch.cgi
[Mon Nov 04 09:45:32 2013] [error] [client 128.117.20.57] Script timed out before returning headers: dispatch.cgi
以下是我的Apache配置(Apache v2.2.15):

NameVirtualHost*:80
服务器名mcmes21.cgd.ucar.edu
服务器别名mcmes21
DocumentRoot/var/www/ip2map/public
服务器管理员mcarey@ucar.edu
不允许超限
选项+执行CGI-多视图+符号链接所有者匹配
命令允许,拒绝
通融
AddHandler cgi script.cgi
重新启动发动机
重写cond%{REQUEST_FILENAME}-F
重写规则^(.*)$/dispatch.cgi$1[QSA,L]
ErrorLog/var/log/httpd/ip2map-error\u log
CustomLog/var/log/httpd/ip2map-access\u日志公用
请注意,当使用以下Apache配置通过mod_代理与Starman一起使用时,我的应用程序运行良好:

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName mcmes21.cgd.ucar.edu
    ServerAlias mcmes21

    DocumentRoot /var/www/ip2map

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyPass        / http://localhost:5000/
    ProxyPassReverse / http://localhost:5000/
</VirtualHost>
NameVirtualHost*:80
服务器名mcmes21.cgd.ucar.edu
服务器别名mcmes21
DocumentRoot/var/www/ip2map
命令拒绝,允许
通融
ProxyPass/http://localhost:5000/
ProxyPassReverse/http://localhost:5000/
有人知道我怎样才能让它作为CGI工作吗


注意:我昨天也在dancer用户邮件列表中发布了这个问题。

使用以下命令配置Apache以使用mod_perl运行dancer应用程序。这比CGI快得多

  • 安装mod_perl,如果尚未安装:

     sudo apt-get install libapache2-mod-perl2
    
     sudo apt-get install libplack-perl
     sudo apt-get install libdancer-perl
    
  • 安装Plack和Dancer(如果尚未安装):

     sudo apt-get install libapache2-mod-perl2
    
     sudo apt-get install libplack-perl
     sudo apt-get install libdancer-perl
    
  • 将以下内容添加到apache中的站点配置中(通常在../sites中可用)。在下面的代码片段中,我使用/home/user/dancerapp作为您的dancer应用程序的绝对路径,“dancerapp.com”作为您的服务器名。请确保更改到您的应用程序:

     <VirtualHost *:80>
    
     ServerName dancerapp.com
    
     DocumentRoot /home/user/dancerapp/public
    
     <Location />
       SetHandler perl-script
       PerlResponseHandler Plack::Handler::Apache2
       PerlSetVar psgi_app /home/user/dancerapp/bin/app.pl
       SetEnv DANCER_ENVIRONMENT "production"
     </Location>
    
     <Perl>
       use Plack::Handler::Apache2;
       Plack::Handler::Apache2->preload("/home/user/dancerapp/bin/app.pl");
     </Perl>
    
     </VirtualHost>
    

  • 我记得几个月前,我还在为同样的问题苦苦挣扎。我最终通过使用Apache+mod_perl(而不是CGI)运行了它。让我知道这个选择是否有兴趣,我会作为答案发布。@yahermann这肯定会有帮助。