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

标签 perl apache cgi dancer

我正在尝试使用 Apache 将 Dancer2 应用程序部署为 cgi 脚本。我遵循 instructions in the Dancer2 deployment guide 作为 cgi 脚本运行,但当我尝试在浏览器中访问我的应用程序时,我收到 HTTP 504 网关超时。

我对 PSGI/Plack 世界是全新的,所以我的诊断可能有很大偏差,但看起来就像当我请求时

http://<hostname>/

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

<VirtualHost *:80>
    ServerName mcmes21.cgd.ucar.edu
    ServerAlias mcmes21
    DocumentRoot /var/www/ip2map/public
    ServerAdmin <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="335e505241564a73465052411d565746" rel="noreferrer noopener nofollow">[email protected]</a>

    <Directory "/var/www/ip2map/public">
       AllowOverride None
       Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
       Order allow,deny
       Allow from all
       AddHandler cgi-script .cgi
    </Directory>

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ /dispatch.cgi$1 [QSA,L]

    ErrorLog  /var/log/httpd/ip2map-error_log
    CustomLog /var/log/httpd/ip2map-access_log common
</VirtualHost>

请注意,使用以下 Apache 配置通过 mod_proxy 与 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>

有谁知道我怎样才能让它作为 CGI 工作?

注意:我昨天也将这个问题发布到了 dancer-users 邮件列表。

最佳答案

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

  1. 安装 mod_perl(如果尚未安装):

     sudo apt-get install libapache2-mod-perl2
    
  2. 安装 Plack 和 Dancer(如果尚未安装):

     sudo apt-get install libplack-perl
     sudo apt-get install libdancer-perl
    
  3. 将以下内容添加到 apache 中的站点配置中(通常在 ../sites-available 中)。在下面的代码片段中,我使用/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>
    
  4. 记得重启apache:

      sudo /etc/init.d/apache2 restart
    

关于perl - 作为 cgi 脚本运行 Dancer2 应用程序时 HTTP 504 网关超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19798002/

相关文章:

perl - CGI/Perl "use"函数

apache - 在 apache 中将 REMOTE_ADDR 设置为 X-Forwarded-For

perl - foreach 和特殊变量 $_ 未按预期运行

linux - 获取完整的当前 crontab 行,并为每行创建唯一的结果电子邮件 header (发件人、主题等)

perl - 使用 perl 和 webdav 访问共享点

apache - tomcat 7 正在使用 Xampp 1.8.1 : Apache cannot start in port 8080,

php - Vagrant 和 symfony2

apache - .htaccess 使用 UTF 8 字符重定向 URL

python - 从/cgi-bin/文件夹执行Python CGI

perl - 您如何使用Perl中的sed?