2015-01-04 7 views
7

Я пытаюсь получить 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 
+0

Что такое вывод команды «mojo version»? –

+0

Это то, что я решил установить. Я использую 5.71. –

+0

Интересной частью выхода «mojo version» является то, какие дополнительные модули установлены –

ответ

4

Oleg answers the question, но в предположениях есть некоторые недостающие части.

Во-первых, создать новое приложение Heroku и запомнить имя приложения:

$ 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 

Затем добавьте Perloku построить пакет:

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

Создать мерзавец репо и установки на Heroku:

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

Для того, чтобы все работало, вам нужно Perloku, чтобы начать hypnotoad на переднем плане. Вы должны указать perl explicity, потому что строка shebang в hypnotoad относится к временному местоположению perl, когда оно было построено и где его больше нет. Измените myapp.pl на то, что вы назвали своим приложением.

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

Чтобы получить все установлено, вы используете стандартный Makefile.PL. Укажите Mojolicious в качестве одной из предпосылок:

use strict; 
use warnings; 

use ExtUtils::MakeMaker; 

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

Наконец, само приложение, которые вы можете создать с mojo (который называет это myapp.ppl)

$ mojo generate lite_app 

Вот сгенерированный источник:

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

# Documentation browser under "/perldoc" 
plugin 'PODRenderer'; 

get '/' => sub { 
    my $c = shift; 
    $c->render('index'); 
}; 

app->start; 
__DATA__ 

@@ index.html.ep 
% layout 'default'; 
% title 'Welcome'; 
Welcome to the Mojolicious real-time web framework! 

@@ layouts/default.html.ep 
<!DOCTYPE html> 
<html> 
    <head><title><%= title %></title></head> 
    <body><%= content %></body> 
</html> 

Вы должны изменить базовую программу, так как hypnotoad нуждается в некоторой конфигурации (где сервер по умолчанию не работает):

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

# Documentation browser under "/perldoc" 
plugin 'PODRenderer'; 

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

get '/' => sub { 
    my $c = shift; 
    $c->render('index'); 
}; 

app->start; 
__DATA__ 

@@ index.html.ep 
% layout 'default'; 
% title 'Welcome'; 
Welcome to the Mojolicious real-time web framework! 

@@ layouts/default.html.ep 
<!DOCTYPE html> 
<html> 
    <head><title><%= title %></title></head> 
    <body><%= content %></body> 
</html> 

Как только у вас есть все файлы, скопируйте их и нажмите на ветвь герою.

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

Когда вы нажимаете, крючок запускает все.

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 

URL вашего приложения отображается в конце вывода.

Почему это работает для меня, прежде чем я не знаю. Я позволил команде mojo развернуться для меня, так что там может быть что-то, чтобы расследовать там. Однако, это немного легче совершить и нажимать без посредника.

+0

А как насчет $ PORT? Вам не нужно указывать, какой порт hypnotoad должен прослушивать? –

+0

А, да, я исправлю это –

5

Это действительно просто дикая догадка, но, может быть, инфраструктура героику не ожидает, что бегун прекратит свое существование? Если это так, вы можете попытаться запустить hypnotoad с --foreground или -f.

Кроме того, вы можете попытаться выполнить некоторую регистрацию внутри приложения, чтобы убедиться, что он когда-либо запускает его.

+0

Вы заметите, что я сделал запись. Это дикая догадка, что совсем не полезно. Я предпочитаю ответы, которые не догадываются. –

+1

Хорошо, в будущем я воздержусь ответить на вас, если я не верю в правильном ответе. – moritz

4

После некоторого тестирования я нашел способ запуска Hypnotoad на Heroku

1. Содержание Perloku должен выглядеть как этот

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

Описание

Прежде всего, нам нужно explicity call perl. Поскольку

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

показывает

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

где /tmp/perl/perls/perl-5.18.1/bin/perl не существует. Итак, /app/vendor/perl-deps/bin/hypnotoad не запустится, но perl /app/vendor/perl-deps/bin/hypnotoad будет в порядке.

Затем нам нужна клавиша -f для гипнозагрузки, как предположил @moritz. В противном случае геройку подумает, что ваше приложение закончилось неожиданно.

2. Вы должны начать Hypnotoad на порт $ ENV {PORT}

Для Mojolicious::Lite вам просто нужно написать что-то вроде этого в верхней части приложения:

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

Для полного приложения вы можете сделать это внутри обработчика startup.

3. Heroku открытым


И это полный код приложения Mojolicious :: Lite

#!/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 журналы

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 для моего приложения: http://floating-temple-3676.herokuapp.com/
BTW , Я не использовал mojo deploy, только git

+0

Это не сработало для меня. Я обновил сообщение журналами. Ты заработал? Можете ли вы показать _mojocrashtest_? –

+0

Он просто работает. Я обновил свой ответ –

+0

Хорошо, не развертывание через mojo работает.В Mojolicious :: Command :: deploy :: heroku должно быть что-то не работает. Это крошечный бит, который отсутствовал во всем этом. –

Смежные вопросы