Время ожидания шлюза 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.
Установите mod_perl, если он еще не установлен:
sudo apt-get install libapache2-mod-perl2
Установите Plack и Dancer, если еще не установлены:
sudo apt-get install libplack-perl sudo apt-get install libdancer-perl
Добавьте следующее в конфигурацию вашего сайта в 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>
Не забудьте перезапустить apache:
sudo /etc/init.d/apache2 restart