2015-01-04 7 views
7

Ich versuche, Hypnotoad mit einer Mojolicious::Lite App unter Heroku mit Perloku zu bekommen. Es gibt etwas, das nicht passiert, wenn hypnotoad in seine Ausführungsschleife gerät, die es zum Absturz bringt. Ich denke, ich vermisse etwas Einfaches, aber die Heroku-Dokumente haben mir nicht geholfen, und ich konnte keine guten Fehlermeldungen daraus machen.Warum stürzt Hypnotoad auf Heroku?

ich mit einer sehr einfachen Anwendung starten, damit einige Umgebungsvariablen zeigen:

#!/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> 

Als ich das lokal ausgeführt, ich kein Problem haben. Ich sehe von den Umgebungsvariablen, die mein Programm unter hypnotoad ausgeführt wird:

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 

Nun, ich implementieren diese mit Mojolicious::Command::deploy::heroku:

% toady deploy heroku --create 

Dies wird bei https://frozen-brushlands-4002.herokuapp.com ausgeführt wird, unter Verwendung der Standard Perloku Datei:

Dies ist nicht ausgeführt Hypnotoad obwohl trotz einiger Referenzen, die ich gesehen habe, das ist, was ich bekommen sollte. Die Anwendung funktioniert, aber:

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 

ich dachte, ich könnte nur die Perloku Datei ändern hypnotoad zu starten:

#!/bin/sh 
/app/vendor/perl/bin/perl /app/vendor/perl-deps/bin/hypnotoad toady 

hypnotoad beginnt und fast schaltet sofort ohne weitere Protokollmeldungen nach unten:

% 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 

Ich kann den Aufruf ändern, um die -t verwenden, um die App zu testen, um zu sehen, ob:

#!/bin/sh 
/app/vendor/perl/bin/perl /app/vendor/perl-deps/bin/hypnotoad -t toady 

Das funktioniert und ich bekomme das "Alles sieht gut aus!" Nachricht, so hypnotoad ausgeführt wird:

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 

Ich schalte die Debug-Protokollierung Mojo, aber ich sehe nicht, zusätzliche Ausgabe andere als meine eigenen Aussagen.

#!/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 

Ich habe versucht, andere Dinge, wie so dass es ein Modul laden Ich weiß nicht da ist und ich erhalte die erwarteten Fehler in den Protokollen „kann nicht gefunden werden“.

Das Laufen von der Schale in heroku (heroku run bash) war nicht erhellend. Der Ausgang des mojo version ist die gleiche wie auf meinem lokalen Rechner:

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

ich meine, es ist etwas wirklich einfach, dass ich fehle, aber zur gleichen Zeit, nichts davon ist für eine einfache Debugging architected.

Oleg kommt ein wenig näher, aber es gibt immer noch Probleme. Ich hatte die Vordergrundoption schon einmal ausprobiert und stieß auf die gleichen Probleme, habe sie aber nicht erwähnt.

Wenn ich Hypnotoad im Vordergrund starte, versucht es an eine Adresse zu binden. Es kann nicht binden an Port 80 (oder 443) und stürzt ab, und es kann auf 127.0.0.1 hören: fast, aber es sieht aus wie es vollständig hören nicht auf:

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 

Hier ist mit einem unprivilegierten Port:

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

Was ist die Ausgabe von "mojo version" -Befehl? –

+0

Es ist alles, was ich installieren möchte. Ich benutze 5.71. –

+0

Der interessante Teil der 'mojo version'-Ausgabe ist, welche optionalen Module installiert sind –

Antwort

4

Oleg answers the question, aber es fehlen einige Teile in den Annahmen.

zunächst eine neue Heroku App erstellen und den Namen der App erinnern:

$ heroku create 
Creating vast-spire-6174... done, stack is cedar-14 
https://vast-spire-6174.herokuapp.com/ | https://git.heroku.com/vast-spire-6174.git 

Als Nächstes fügen Sie das Perloku Pack bauen:

$ heroku config:add BUILDPACK_URL=https://github.com/judofyr/perloku.git 

Erstellen Sie die git Repo und Setup auf Heroku:

$ mkdir testapp 
$ cd testapp 
$ git init 
$ heroku git:remote -a vast-spire-6174 

Um alles funktioniert, müssen Sie ein Perloku Datei zum Starten hypnotoad im Vordergrund. Sie müssen Explicity angeben, da die Shebang-Linie in hypnotoad auf die temporäre Position von perl verweist, als es gebaut wurde und wo es nicht mehr ist. Ändern Sie myapp.pl zu dem, was Sie Ihre Anwendung benannt haben.

#!/bin/sh 
/app/vendor/perl/bin/perl /app/vendor/perl-deps/bin/hypnotoad -f myapp.pl 

Um alles installiert zu erhalten, verwenden Sie einen Standard Makefile.PL. Geben Sie Mojolicious als eine der Voraussetzungen:

use strict; 
use warnings; 

use ExtUtils::MakeMaker; 

WriteMakefile(
    VERSION => '0.01', 
    PREREQ_PM => {'Mojolicious' => '5.72'}, 
    test  => {TESTS => 't/*.t'} 
); 

Schließlich ist die App selbst, die Sie mit mojo erstellen

(die myapp.ppl ist nennt)
$ mojo generate lite_app 

Hier ist die erzeugte Quelle:

Sie müssen das Basisprogramm ändern, da Hypnotoad ein bisschen Konfiguration benötigt

Sobald Sie alle Dateien haben, committen Sie sie und drücken Sie auf den Zweig Heroku.

$ git add . 
$ git commit -am "make it better" 
$ git push heroku master 

Wenn Sie drücken, startet ein Haken alles.

Counting objects: 7, done. 
Delta compression using up to 4 threads. 
Compressing objects: 100% (7/7), done. 
Writing objects: 100% (7/7), 1.14 KiB | 0 bytes/s, done. 
Total 7 (delta 0), reused 0 (delta 0) 
remote: Compressing source files... done. 
remote: Building source: 
remote: 
remote: -----> Fetching custom git buildpack... done 
remote: -----> Perloku app detected 
remote: -----> Vendoring Perl 
remote:  Using Perl 5.18.1 
remote: -----> Installing dependencies 
remote:  --> Working on /tmp/build_a73f24f0619fa2ab299586098c5e8daf 
remote:  Configuring /tmp/build_a73f24f0619fa2ab299586098c5e8daf ... OK 
remote:  ==> Found dependencies: Mojolicious 
remote:  --> Working on Mojolicious 
remote:  Fetching http://www.cpan.org/authors/id/S/SR/SRI/Mojolicious-5.72.tar.gz ... OK 
remote:  Configuring Mojolicious-5.72 ... OK 
remote:  ==> Found dependencies: IO::Socket::IP 
remote:  --> Working on IO::Socket::IP 
remote:  Fetching http://www.cpan.org/authors/id/P/PE/PEVANS/IO-Socket-IP-0.36.tar.gz ... OK 
remote:  Configuring IO-Socket-IP-0.36 ... OK 
remote:  Building IO-Socket-IP-0.36 ... OK 
remote:  Successfully installed IO-Socket-IP-0.36 
remote:  Building Mojolicious-5.72 ... OK 
remote:  Successfully installed Mojolicious-5.72 
remote:  <== Installed dependencies for /tmp/build_a73f24f0619fa2ab299586098c5e8daf. Finishing. 
remote:  2 distributions installed 
remote:  Dependencies installed 
remote: -----> Discovering process types 
remote:  Procfile declares types -> (none) 
remote:  Default types for Perloku -> web 
remote: 
remote: -----> Compressing... done, 14.1MB 
remote: -----> Launching... done, v5 
remote:  https://vast-spire-6174.herokuapp.com/ deployed to Heroku 
remote: 
remote: Verifying deploy... done. 
To https://git.heroku.com/vast-spire-6174.git 
* [new branch]  master -> master 

Die URL Ihrer Anwendung zeigt sich gegen Ende der Ausgabe.

Warum das für mich funktionierte, bevor ich es nicht weiß. Ich ließ einen mojo-Befehl für mich bereitstellen, also könnte dort etwas zu untersuchen sein. Es ist jedoch ein wenig einfacher, ohne den Vermittler zu binden und zu pushen.

+0

Und wie wäre es mit $ PORT? Müssen Sie nicht angeben, auf welchen Port hypnotoad hören soll? –

+0

Ah, ja, ich werde das reparieren –

5

Das ist wirklich nur eine wilde Vermutung, aber vielleicht erwartet die Heroku-Infrastruktur nicht, dass der Läufer beendet wird? Wenn ja, könnten Sie versuchen, hypnotoad mit --foreground oder -f zu starten.

Sie könnten auch versuchen, einige Protokollierung von innerhalb der Anwendung zu tun, um zu sehen, ob es jemals überhaupt ausgeführt wird.

+0

Sie werden feststellen, dass ich protokolliert habe. Dies ist eine wilde Vermutung, die überhaupt nicht hilfreich ist. Ich bevorzuge Antworten, die keine Vermutungen sind. –

+1

Ok, in Zukunft werde ich dich nicht mehr beantworten, es sei denn, ich bin sicher, es ist die richtige Antwort. – moritz

4

Nach einigen Tests fand ich einen Weg hypnotoad auf Heroku

1. Perloku Inhalt laufen sollte

#!/bin/sh 
perl /app/vendor/perl-deps/bin/hypnotoad -f mojocrashtest 

Beschreibung

Zunächst einmal müssen wir wie dieses sieht Explicity Anruf perl. Da

heroku run bash 
head /app/vendor/perl-deps/bin/hypnotoad 

zeigt

#!/tmp/perl/perls/perl-5.18.1/bin/perl 

eval 'exec /tmp/perl/perls/perl-5.18.1/bin/perl -S $0 ${1+"[email protected]"}' 
    if 0; # not running under some shell 

wo /tmp/perl/perls/perl-5.18.1/bin/perl existiert nicht. Also, /app/vendor/perl-deps/bin/hypnotoad wird nicht gestartet, aber perl /app/vendor/perl-deps/bin/hypnotoad wird in Ordnung sein.

Dann brauchen wir Schlüssel -f für Hypnotoad als @moritz erraten. Sonst denkt Heroku, dass deine App unerwartet beendet wurde.

2. Sie sollten hypnotoad auf Port $ ENV {PORT}

Für Mojolicious::Lite Sie brauchen nur zu schreiben, so etwas wie dies an der Spitze der App starten:

plugin Config => {default => {hypnotoad => {listen => ["http://*:$ENV{PORT}"]}}}; 

Für vollständige App Sie können es innerhalb der startup Handler tun.

3. Heroku offen


Und dies ist eine vollständige Code von Mojolicious :: Lite-Anwendung

#!/usr/bin/env perl 
# today 
use Mojolicious::Lite; 

plugin Config => {default => {hypnotoad => {listen => ["http://*:$ENV{PORT}"]}}}; 

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> 

Heroku logs

2015-01-13T12:08:04.843204+00:00 heroku[web.1]: Starting process with command `./Perloku` 
2015-01-13T12:08:06.019070+00:00 app[web.1]: Server available at http://127.0.0.1:13533. 
2015-01-13T12:08:06.018899+00:00 app[web.1]: [Tue Jan 13 12:08:06 2015] [info] Listening at "http://*:13533". 
2015-01-13T12:08:06.019035+00:00 app[web.1]: [Tue Jan 13 12:08:06 2015] [info] Manager 3 started. 
2015-01-13T12:08:06.055437+00:00 app[web.1]: [Tue Jan 13 12:08:06 2015] [info] Creating process id file "/app/hypnotoad.pid". 
2015-01-13T12:08:06.412283+00:00 heroku[web.1]: State changed from starting to up 
2015-01-13T12:08:08.040072+00:00 heroku[router]: at=info method=GET path="/" host=floating-temple-3676.herokuapp.com request_id=e9f9bb4d-f71f-4b4c-a129-70faf044c38b fwd=194" dyno=web.1 connect=3ms service=34ms status=200 bytes=586 
2015-01-13T12:08:08.029819+00:00 app[web.1]: Use of uninitialized value in concatenation (.) or string at /app/mojocrashtest line 13, <DATA> line 39. 
2015-01-13T12:08:08.029836+00:00 app[web.1]: Use of uninitialized value in concatenation (.) or string at /app/mojocrashtest line 13, <DATA> line 39. 
2015-01-13T12:08:08.029839+00:00 app[web.1]: Use of uninitialized value in concatenation (.) or string at /app/mojocrashtest line 13, <DATA> line 39. 
2015-01-13T12:08:08.029842+00:00 app[web.1]: Use of uninitialized value in concatenation (.) or string at /app/mojocrashtest line 13, <DATA> line 39. 

URL für meine App: http://floating-temple-3676.herokuapp.com/
BTW Ich habe mojo deploy nicht verwendet, nur git

+0

Das hat nicht für mich funktioniert. Ich habe den Post mit Protokollen aktualisiert. Hast du deine zur Arbeit bekommen? Kannst du _mojocrashtest_ zeigen? –

+0

Es funktioniert einfach. Ich habe meine Antwort aktualisiert –

+0

Okay, nicht durch mojo funktioniert.Es muss etwas in Mojolicious :: Command :: deploy :: heroku geben, das nicht richtig funktioniert. Das ist das winzige bisschen, das in all dem fehlte. –