Время ожидания шлюза HTTP 504 при запуске приложения Dancer2 в виде cgi-скрипта

Я пытаюсь развернуть приложение Dancer2 как cgi-скрипт с Apache. Я следовал инструкциям в руководстве по развертыванию Dancer2 для запуска в качестве 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 mcarey@ucar.edu

    <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>

Обратите внимание, что мое приложение работает нормально, когда обслуживается со Starman через mod_proxy со следующей конфигурацией Apache:

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?

Примечание: я также вчера отправил этот вопрос в список рассылки танцоров-пользователей.

1 ответ

Решение

Используйте следующее для настройки Apache для запуска приложения Dancer с помощью mod_perl. Это намного быстрее, чем 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 в качестве абсолютного пути к вашему приложению танцора, а "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
    
Другие вопросы по тегам