perl - 为什么我使用 hypnotoad 在 Heroku 上崩溃了?

标签 perl heroku mojo hypnotoad

我正在尝试使用 Mojolicious::Lite 获得催眠蟾蜍应用程序在 Heroku 上运行与 Perloku . hypnotoad 时有些事情不会发生进入导致它崩溃的运行循环。我想我遗漏了一些简单的东西,但是 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 ( heroku run bash ) 中的 shell 运行没有启发。 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,它会尝试绑定(bind)到一个地址。它无法绑定(bind)到端口 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

最佳答案

这真的只是一个疯狂的猜测,但也许 heroku 基础设施并不期望 runner 终止?如果是这样,您可以尝试使用 --foreground 开始催眠蟾蜍。或 -f .

此外,您可以尝试从应用程序内部进行一些日志记录,以查看它是否曾经运行过它。

关于perl - 为什么我使用 hypnotoad 在 Heroku 上崩溃了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27771510/

相关文章:

webos - 棕榈魔力 : Object properties

perl - 将散列存储在散列中

ruby-on-rails - WickedPdf 在生产中不显示来自 S3 的远程图像

heroku - 无法将 Rails Bootstrap 项目推送到 Heroku

javascript - 国际电话输入问题

maven-2 - 从 Maven 插件检测 Maven 构建状态(成功/错误)

regex - Perl 正则表达式帮助 : character set, 文字反斜杠、引号字符

perl - 嵌套while循环以计算多个目的地的距离

Perl 将 sub 标记为 Public 或 Private

ruby-on-rails - 事情在 sidekiq 中排队但没有在 heroku 中执行