2015-01-04 10 views
7

Tôi đang cố gắng để có được hypnotoad với ứng dụng Mojolicious::Lite chạy trên Heroku với Perloku. Có một cái gì đó không xảy ra khi hypnotoad được vào vòng lặp chạy của nó gây ra nó sụp đổ. Tôi nghĩ rằng tôi đang thiếu một cái gì đó đơn giản, nhưng các tài liệu Heroku đã không giúp đỡ và tôi đã không thể coax thông báo lỗi tốt ra khỏi điều này.Tại sao việc sử dụng hypnotoad của tôi bị rơi trên Heroku?

tôi bắt đầu với một ứng dụng rất đơn giản để hiển thị một số biến môi trường:

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

Khi tôi chạy này tại địa phương, tôi không có vấn đề. Tôi nhìn thấy từ các biến môi trường mà chương trình của tôi đang chạy theo 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 

Bây giờ, tôi triển khai này với Mojolicious::Command::deploy::heroku:

% toady deploy heroku --create 

này đang chạy ở https://frozen-brushlands-4002.herokuapp.com, sử dụng file Perloku mặc định:

#!/bin/sh 
./toady daemon --listen http://*:$PORT --mode production 

Mặc dù vậy, một số tài liệu tham khảo tôi đã thấy cho biết đó là những gì tôi nên nhận. Ứng dụng này hoạt động, mặc dù:

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 

tôi figured Tôi chỉ có thể thay đổi các tập tin Perloku để bắt đầu hypnotoad:

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

bắt đầu hypnotoad và gần như ngay lập tức tắt không có thông điệp nhật ký khác:

% 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ôi có thể thay đổi lời gọi để sử dụng -t để kiểm tra ứng dụng để xem liệu:

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

Hoạt động đó và tôi nhận được "Mọi thứ đều tốt!" tin nhắn, vì vậy hypnotoad đang chạy:

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 

Tôi bật ghi nhật ký gỡ lỗi Mojo, nhưng tôi không thấy đầu ra bổ sung ngoài báo cáo của riêng tôi.

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

Tôi đã thử những thứ khác, chẳng hạn như làm cho nó tải mô-đun mà tôi biết không có và tôi nhận được lỗi "Không thể tìm thấy" dự kiến ​​trong nhật ký.

Chạy từ vỏ trong heroku (heroku run bash) không sáng. Kết quả của mojo version cũng giống như trên máy tính địa phương của tôi:

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

tôi tìm có điều gì đó thực sự đơn giản rằng tôi đang mất tích, nhưng cùng một lúc, không ai trong số này là kiến ​​trúc để dễ dàng gỡ lỗi.


Oleg tiến gần hơn một chút, nhưng vẫn còn vấn đề. Tôi đã thử tùy chọn nền trước và chạy vào cùng một vấn đề nhưng không đề cập đến nó.

Nếu tôi bắt đầu hypnotoad ở nền trước, nó sẽ cố gắng liên kết với một địa chỉ. Nó không thể liên kết với cổng 80 (hoặc 443) và đụng độ, và nó có thể nghe 127.0.0.1: hầu hết, nhưng có vẻ như nó không hoàn toàn lắng nghe:

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 

Dưới đây là với một cổng không có đặc quyền:

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

Đầu ra của lệnh "phiên bản mojo" là gì? –

+0

Đó là bất cứ điều gì tôi quyết định cài đặt. Tôi đang sử dụng 5.71. –

+0

Phần thú vị của đầu ra 'phiên bản mojo' là những mô-đun tùy chọn được cài đặt –

Trả lời

4

Oleg answers the question, nhưng có một số phần bị thiếu trong các giả định.

Đầu tiên, tạo một ứng dụng Heroku mới và nhớ tên của ứng dụng:

$ 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 

Tiếp theo, thêm Perloku xây dựng gói:

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

Tạo repo git và thiết lập trên Heroku:

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

Để làm mọi thứ hoạt động, bạn cần Perloku tệp để bắt đầu hypnotoad ở mặt trước. Bạn phải chỉ định perl giải thích vì đường shebang trong hypnotoad là vị trí tạm thời của perl khi được xây dựng và vị trí không còn nữa. Thay đổi myapp.pl vào bất kỳ tên nào bạn đã đặt tên cho đơn đăng ký của mình.

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

Để có được tất cả mọi thứ được cài đặt, bạn sử dụng một tiêu chuẩn Makefile.PL. Chỉ định Mojolicious là một trong những điều kiện tiên quyết:

use strict; 
use warnings; 

use ExtUtils::MakeMaker; 

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

Cuối cùng, ứng dụng riêng của mình, mà bạn có thể tạo ra với mojo (trong đó kêu gọi là myapp.ppl)

$ mojo generate lite_app 

Đây là nguồn tạo ra:

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

Bạn phải sửa đổi chương trình cơ bản vì hypnotoad cần một chút cấu hình (nơi máy chủ mặc định không):

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

Khi bạn có tất cả các tệp, hãy cam kết và chuyển đến nhánh heroku.

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

Khi bạn đẩy, móc sẽ khởi động mọi thứ.

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 của ứng dụng của bạn hiển thị ở cuối đầu ra.

Tại sao điều này làm việc cho tôi trước khi tôi không biết. Tôi đã cho phép một lệnh mojo triển khai cho tôi, vì vậy có thể có một cái gì đó để điều tra ở đó. Tuy nhiên, nó dễ dàng hơn một chút để cam kết và đẩy mà không có trung gian.

+0

Và làm thế nào về $ PORT? Bạn không cần phải xác định trên đó hypnotoad cổng nên lắng nghe? –

+0

Ah, vâng tôi sẽ sửa lỗi đó –

5

Đây thực sự chỉ là phỏng đoán hoang dã, nhưng có lẽ cơ sở hạ tầng heroku không mong đợi người chạy đến kết thúc? Nếu vậy, bạn có thể thử để bắt đầu hypnotoad với --foreground hoặc -f.

Ngoài ra, bạn có thể thử thực hiện một số thao tác ghi nhật ký từ bên trong ứng dụng để xem nó có chạy không.

+0

Bạn sẽ nhận thấy tôi đã ghi nhật ký. Đây là một dự đoán hoang dã mà không phải là tất cả hữu ích. Tôi thích câu trả lời mà không đoán. –

+1

Ok, trong tương lai tôi sẽ không trả lời bạn trừ khi tôi chắc chắn đó là câu trả lời đúng. – moritz

4

Sau một số thử nghiệm Tôi tìm thấy một cách để chạy hypnotoad trên Heroku

1. nội dung Perloku nên trông như thế này

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

Mô tả

Trước hết chúng ta cần phải cuộc gọi perl. Bởi vì

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

lãm

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

nơi /tmp/perl/perls/perl-5.18.1/bin/perl không tồn tại. Vì vậy, /app/vendor/perl-deps/bin/hypnotoad sẽ không bắt đầu, nhưng perl /app/vendor/perl-deps/bin/hypnotoad sẽ ok.

Sau đó, chúng tôi cần có mã số -f cho hypnotoad như @moritz được đoán. Nếu không, heroku sẽ cho rằng ứng dụng của bạn đã hoàn tất bất ngờ.

2. Bạn nên bắt đầu hypnotoad trên cổng $ ENV {} PORT

Đối Mojolicious::Lite bạn chỉ cần viết một cái gì đó như thế này ở trên cùng của ứng dụng của bạn:

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

Đối với ứng dụng đầy đủ bạn có thể làm điều đó bên trong trình xử lý startup.

3. Heroku mở


Và đây là một mã đầy đủ các ứng dụng 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> 

bản ghi 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 cho ứng dụng của tôi: http://floating-temple-3676.herokuapp.com/
BTW , tôi không sử dụng mojo deploy, chỉ git

+0

Điều này không hiệu quả đối với tôi. Tôi đã cập nhật bài đăng bằng nhật ký. Bạn có làm việc của bạn không? Bạn có thể hiển thị _mojocrashtest_ không? –

+0

Nó chỉ hoạt động. Tôi đã cập nhật câu trả lời của mình –

+0

Được rồi, không triển khai thông qua các tác phẩm mojo.Phải có một cái gì đó trong Mojolicious :: Command :: deploy :: heroku không hoạt động chính xác. Đó là một chút nhỏ bé đã mất tích trong tất cả những điều này. –

Các vấn đề liên quan