Я пытаюсь получить hypnotoad с Mojolicious::Lite приложение работает на Heroku с Perloku. Есть что-то, чего не происходит, когда hypnotoad попадает в цикл выполнения, который вызывает его сбой. Я полагаю, что мне не хватает чего-то простого, но документы Heroku не помогли, и я не смог уладить хорошие сообщения об ошибках из этого.Почему мое использование гипнозагрузки рушится на Heroku?
Я начинаю с очень простым приложением, поэтому показать некоторые переменные окружения:
#!/usr/bin/env perl
# today
use Mojolicious::Lite;
get '/' => sub {
my $c = shift;
my $content = "Perl: $^X Pid: $$\n\n";
foreach my $key (keys %ENV) {
next unless $key =~ /Mojo|toad/i;
$content .= "$key $ENV{$key}\n";
}
$c->stash(content => $content);
$c->render('index');
};
app->start;
__DATA__
@@ index.html.ep
% layout 'default';
% title 'Welcome';
<p>Welcome to the Mojolicious real-time web framework!</p>
<pre>
<%= $content %>
</pre>
@@ layouts/default.html.ep
<!DOCTYPE html>
<html>
<head><title><%= title %></title></head>
<body><%= content %></body>
</html>
Когда я запускаю это локально, у меня нет никаких проблем. Я вижу из переменных окружения, что моя программа запускается под Hypnotoad:
Welcome to the Mojolicious real-time web framework!
Perl: /Users/brian/Dropbox/bin/perls/perl5.20.0 Pid: 40006
HYPNOTOAD_PID 39981
MOJO_HELP
HYPNOTOAD_TEST
HYPNOTOAD_EXE /Users/brian/bin/perls/hypnotoad5.20.0
MOJO_REUSE 0.0.0.0:8080:6
HYPNOTOAD_REV 3
HYPNOTOAD_APP /Users/brian/Desktop/toady.d/toady
MOJO_MODE production
MOJO_HOME
HYPNOTOAD_STOP
HYPNOTOAD_FOREGROUND
Теперь я раскрываю это с Mojolicious::Command::deploy::heroku:
% toady deploy heroku --create
Это работает на https://frozen-brushlands-4002.herokuapp.com, используя файл Perloku по умолчанию:
#!/bin/sh
./toady daemon --listen http://*:$PORT --mode production
Это не работает гипнота, хотя, несмотря на некоторые ссылки, которые я видел, это говорит о том, что я должен получить. Приложение работает, хотя:
Welcome to the Mojolicious real-time web framework!
Perl: /app/vendor/perl/bin/perl Pid: 3
MOJO_REUSE 0.0.0.0:12270:4
MOJO_HOME
MOJO_HELP
MOJO_MODE production
MOJO_EXE ./toady
Я полагал, что я мог бы просто изменить файл Perloku начать Hypnotoad:
#!/bin/sh
/app/vendor/perl/bin/perl /app/vendor/perl-deps/bin/hypnotoad toady
начинается Hypnotoad и почти сразу выключается без каких-либо других сообщений журнала:
% heroku logs --app ...
2015-01-04T09:23:36.516864+00:00 heroku[web.1]: Starting process with command `./Perloku`
2015-01-04T09:23:38.321628+00:00 heroku[web.1]: State changed from starting to crashed
Я могу изменить вызов, чтобы использовать -t
, чтобы проверить, есть ли:
#!/bin/sh
/app/vendor/perl/bin/perl /app/vendor/perl-deps/bin/hypnotoad -t toady
Это работает, и я получаю «Все выглядит хорошо!» сообщение, так Hypnotoad работает:
2015-01-04T09:36:36.955680+00:00 heroku[web.1]: Starting process with command `./Perloku`
2015-01-04T09:36:38.340717+00:00 app[web.1]: Everything looks good!
2015-01-04T09:36:39.085887+00:00 heroku[web.1]: State changed from starting to crashed
Включаю Mojo протоколирования отладки, но я не вижу, дополнительный выход, кроме моих собственных заявлений.
#!/usr/bin/env perl
use Mojolicious::Lite;
$|++;
my $log = app->log;
$log->level('debug');
$log->debug("INC: @INC");
get '/' => sub {
...;
};
$log->debug("Right before start");
my $app = app->start;
$log->debug("Right after start");
$app; # must return application object
Я попробовал другие вещи, например, что делает его загрузить модуль я знаю, не существует, и я получаю ожидаемый «Не удалось найти» ошибки в журналах.
Запуск из корпуса в герою (heroku run bash
) не освещался. Выход mojo version
такого же, как на моей локальной машине:
$ perl vendor/perl-deps/bin/mojo version
CORE
Perl (v5.16.2, linux)
Mojolicious (5.71, Tiger Face)
OPTIONAL
EV 4.0+ (n/a)
IO::Socket::Socks 0.64+ (n/a)
IO::Socket::SSL 1.84+ (n/a)
Net::DNS::Native 0.15+ (n/a)
You might want to update your Mojolicious to 5.72.
Я полагаю, что есть что-то очень простое, что я пропавший без вести, но в то же время, никто из этого не спроектирован для создания легкой отладки.
Олег немного поближе, но все еще есть проблемы. Я уже пробовал опцию переднего плана и сталкивался с теми же проблемами, но не упомянул об этом.
Если я начинаю hypnotoad на переднем плане, он пытается привязать к адресу. Он не может связать порт 80 (или 443) и аварии, и он может слушать 127.0.0.1: почти, но похоже, что он не в состоянии полностью слушать:
2015-01-13T11:47:54+00:00 heroku[slug-compiler]: Slug compilation started
2015-01-13T11:48:32+00:00 heroku[slug-compiler]: Slug compilation finished
2015-01-13T11:48:32.735095+00:
00 heroku[api]: Deploy dcab778 by ...
2015-01-13T11:48:32.735095+00:00 heroku[api]: Release v31 created by ...
2015-01-13T11:48:32.969489+00:00 heroku[web.1]: State changed from crashed to starting
2015-01-13T11:48:34.909134+00:00 heroku[web.1]: Starting process with command `./Perloku`
2015-01-13T11:48:36.045985+00:00 app[web.1]: Can't create listen socket: Permission denied at /app/vendor/perl-deps/lib/perl5/Mojo/IOLoop.pm line 120.
2015-01-13T11:48:36.920004+00:00 heroku[web.1]: Process exited with status 13
2015-01-13T11:48:36.932014+00:00 heroku[web.1]: State changed from starting to crashed
Вот с непривелигированным портом:
2015-01-13T11:39:10+00:00 heroku[slug-compiler]: Slug compilation started
2015-01-13T11:39:44+00:00 heroku[slug-compiler]: Slug compilation finished
2015-01-13T11:39:44.519679+00:00 heroku[api]: Deploy bbd1f68 by ...
2015-01-13T11:39:44.519679+00:00 heroku[api]: Release v29 created by ...
2015-01-13T11:39:44.811111+00:00 heroku[web.1]: State changed from crashed to starting
2015-01-13T11:39:47.382298+00:00 heroku[web.1]: Starting process with command `./Perloku`
2015-01-13T11:39:48.454706+00:00 app[web.1]: [Tue Jan 13 11:39:48 2015] [info] Listening at "http://*:8000".
2015-01-13T11:39:48.454733+00:00 app[web.1]: Server available at http://127.0.0.1:8000.
2015-01-13T11:39:48.454803+00:00 app[web.1]: [Tue Jan 13 11:39:48 2015] [info] Manager 3 started.
2015-01-13T11:39:48.480084+00:00 app[web.1]: [Tue Jan 13 11:39:48 2015] [info] Creating process id file "/app/hypnotoad.pid".
2015-01-13T11:40:47.703110+00:00 heroku[web.1]: Stopping process with SIGKILL
2015-01-13T11:40:47.702867+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2015-01-13T11:40:48.524470+00:00 heroku[web.1]: Process exited with status 137
2015-01-13T11:40:48.534002+00:00 heroku[web.1]: State changed from starting to crashed
Что такое вывод команды «mojo version»? –
Это то, что я решил установить. Я использую 5.71. –
Интересной частью выхода «mojo version» является то, какие дополнительные модули установлены –