{"id":122611,"date":"2014-01-07T22:04:03","date_gmt":"2014-01-07T18:04:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=122611"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=122611","title":{"rendered":"<span class=\"post_title\">Web \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043f\u043e-\u044f\u043f\u043e\u043d\u0441\u043a\u0438 \u2014 Amon2<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/8b1\/5c5\/487\/8b15c5487d60da0edb9fb09654b40092.png\"\/><\/p>\n<h5>INTRO<\/h5>\n<p>  \u0412 <a href=\"http:\/\/pragmaticperl.com\/issues\/11\/pragmaticperl-11-\u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e-\u0441-tokuhiro-matsuno.html#.Usvim0C2DeM\">\u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u044f\u043f\u043e\u043d\u0446\u0430 Tokuhiro Matsuno<\/a> \u043f\u0440\u043e\u0437\u0432\u0443\u0447\u0430\u043b\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0444\u0440\u0430\u0437\u0430:  <\/p>\n<blockquote><p>\u00ab\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f <b>\u0431\u043e\u043b\u0435\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a<\/b>. \u0412\u0441\u0435 \u044d\u0442\u043e <b>\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 Amon2<\/b>.\u00bb<\/p><\/blockquote>\n<p>  \u042f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0438\u043d\u0444\u044b \u043e\u0431 \u044d\u0442\u043e\u043c \u0432\u0435\u0431 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435. \u0418 \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 Amon2, \u0447\u0438\u0441\u0442\u043e \u0434\u043b\u044f \u0441\u0435\u0431\u044f, \u0438, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u043a\u043e\u043c\u0443-\u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. <\/p>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<h4>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430. <\/h4>\n<p>  \u041f\u043e\u0434 \u0440\u0443\u043a\u0443 \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0430 \u0441 Debian GNU\/Linux 7.3 (wheezy)<br \/>  \u041f\u043e\u0435\u0445\u0430\u043b\u0438\u2026<\/p>\n<pre><code class=\"bash\"># curl -L http:\/\/cpanmin.us | perl - Amon2 ................ Building and testing Amon2-6.00 ... OK Successfully installed Amon2-6.00 78 distributions installed  Successfully installed Amon2-6.00 <\/code><\/pre>\n<p>  \u0412\u0441\u0435! \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430. <\/p>\n<p>  \u0418\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438:  <\/p>\n<ul>\n<li>Built on PSGI\/Plack<\/li>\n<li>no XS deps.<\/li>\n<li>Thin<\/li>\n<li>Easy to learn<\/li>\n<li>CLI support<\/li>\n<li>Stable<\/li>\n<li>Secure options by default<\/li>\n<li>uses Xslate templating<\/li>\n<\/ul>\n<h4>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u0440\u043a\u0430\u0441\u0430<\/h4>\n<pre><code class=\"bash\">adduser dotcloud su - dotcloud amon2-setup.pl BBS <\/code><\/pre>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u0441\u0435 \u0438\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e, \u043f\u043e\u043a\u0430 &#8230;<\/b><\/p>\n<div class=\"spoiler_text\"> \u2014 Running flavor: Basic \u2014 [main] Loading asset: jQuery<br \/>  [main] Loading asset: Bootstrap<br \/>  [main] Loading asset: ES5Shim<br \/>  [main] Loading asset: MicroTemplateJS<br \/>  [main] Loading asset: StrftimeJS<br \/>  [main] Loading asset: SprintfJS<br \/>  [main] Loading asset: MicroLocationJS<br \/>  [main] Loading asset: MicroDispatcherJS<br \/>  [main] Loading asset: XSRFTokenJS<br \/>  [Flavor::Basic] writing tmpl\/index.tx<br \/>  [Flavor::Basic] writing tmpl\/include\/layout.tx<br \/>  [Flavor::Basic] writing tmpl\/include\/pager.tx<br \/>  [Flavor::Basic] writing lib\/BBS.pm<br \/>  [Flavor::Basic] writing lib\/BBS\/Web.pm<br \/>  [Flavor::Basic] writing lib\/BBS\/Web\/Plugin\/Session.pm<br \/>  [Flavor::Basic] writing lib\/BBS\/Web\/Dispatcher.pm<br \/>  [Flavor::Basic] writing lib\/BBS\/Web\/View.pm<br \/>  [Flavor::Basic] writing lib\/BBS\/Web\/ViewFunctions.pm<br \/>  [Flavor::Basic] writing lib\/BBS\/DB.pm<br \/>  [Flavor::Basic] writing lib\/BBS\/DB\/Schema.pm<br \/>  [Flavor::Basic] writing lib\/BBS\/DB\/Row.pm<br \/>  [Flavor::Basic] writing script\/bbs-server<br \/>  [Flavor::Basic] writing Build.PL<br \/>  [Flavor::Basic] writing minil.toml<br \/>  [Flavor::Basic] writing builder\/MyBuilder.pm<br \/>  [Flavor::Basic] writing cpanfile<br \/>  [Flavor::Basic] writing static\/\/js\/jquery-2.0.3.min.js<br \/>  [Flavor::Basic] writing static\/\/bootstrap\/fonts\/glyphicons-halflings-regular.eot<br \/>  [Flavor::Basic] writing static\/\/bootstrap\/css\/bootstrap-theme.min.css<br \/>  [Flavor::Basic] writing static\/\/bootstrap\/fonts\/glyphicons-halflings-regular.woff<br \/>  [Flavor::Basic] writing static\/\/bootstrap\/fonts\/glyphicons-halflings-regular.ttf<br \/>  [Flavor::Basic] writing static\/\/bootstrap\/css\/bootstrap.min.css<br \/>  [Flavor::Basic] writing static\/\/bootstrap\/js\/bootstrap.min.js<br \/>  [Flavor::Basic] writing static\/\/bootstrap\/fonts\/glyphicons-halflings-regular.svg<br \/>  [Flavor::Basic] writing static\/\/bootstrap\/js\/bootstrap.js<br \/>  [Flavor::Basic] writing static\/\/bootstrap\/css\/bootstrap.css<br \/>  [Flavor::Basic] writing static\/\/bootstrap\/css\/bootstrap-theme.css<br \/>  [Flavor::Basic] writing static\/\/js\/es5-shim.min.js<br \/>  [Flavor::Basic] writing static\/\/js\/micro_template.js<br \/>  [Flavor::Basic] writing static\/\/js\/strftime.js<br \/>  [Flavor::Basic] writing static\/\/js\/sprintf-0.7-beta1.js<br \/>  [Flavor::Basic] writing static\/\/js\/micro-location.js<br \/>  [Flavor::Basic] writing static\/\/js\/micro_dispatcher.js<br \/>  [Flavor::Basic] writing static\/\/js\/xsrf-token.js<br \/>  [Flavor::Basic] writing static\/img\/.gitignore<br \/>  [Flavor::Basic] writing static\/robots.txt<br \/>  [Flavor::Basic] writing static\/js\/main.js<br \/>  [Flavor::Basic] writing static\/css\/main.css<br \/>  [Flavor::Basic] writing db\/.gitignore<br \/>  [Flavor::Basic] writing config\/development.pl<br \/>  [Flavor::Basic] writing config\/production.pl<br \/>  [Flavor::Basic] writing config\/test.pl<br \/>  [Flavor::Basic] writing sql\/mysql.sql<br \/>  [Flavor::Basic] writing sql\/sqlite.sql<br \/>  [Flavor::Basic] writing t\/Util.pm<br \/>  [Flavor::Basic] writing t\/00_compile.t<br \/>  [Flavor::Basic] writing t\/01_root.t<br \/>  [Flavor::Basic] writing t\/02_mech.t<br \/>  [Flavor::Basic] writing t\/03_assets.t<br \/>  [Flavor::Basic] writing t\/06_jshint.t<br \/>  [Flavor::Basic] writing xt\/01_pod.t<br \/>  [Flavor::Basic] writing xt\/02_perlcritic.t<br \/>  [Flavor::Basic] writing .gitignore<br \/>  [Flavor::Basic] writing .proverc<br \/>  [Flavor::Basic] writing static\/500.html<br \/>  [Flavor::Basic] writing static\/504.html<br \/>  [Flavor::Basic] writing static\/503.html<br \/>  [Flavor::Basic] writing static\/502.html<br \/>  [Flavor::Basic] writing static\/404.html<br \/>  There is no git command.<br \/>   \u2014 <\/div>\n<\/div>\n<pre><code class=\"bash\">Setup script was done! You are ready to run the skelton.  You need to install the dependencies by:      &gt; carton install  And then, run your application server:      &gt; carton exec perl -Ilib script\/bbs-server  -------------------------------------------------------------- <\/code><\/pre>\n<p>  \u0412\u0440\u043e\u0434\u0435 \u0432\u0441\u0435 \u043e\u043a, \u043d\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 carton \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0432\u0432\u0435\u0441\u0442\u0438 \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434.<br \/>  \u0421\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e   <\/p>\n<pre><code class=\"bash\">cpan Carton  # \u041e\u0442 \u0440\u0443\u0442\u0430 carton install #  \u041d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u043f\u0430\u043f\u043a\u0435 BBS! \u041d\u0435 \u043e\u0442 \u0440\u0443\u0442\u0430! <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439:<\/p>\n<pre><code class=\"bash\">builder  Build.PL  config  cpanfile  cpanfile.snapshot  db  lib  local  minil.toml  script  sql  static  t  tmpl  xt <\/code><\/pre>\n<h4>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h4>\n<pre><code class=\"bash\">cd db vim sqlite.sql <\/code><\/pre>\n<p>  \u0424\u0430\u0439\u043b sqlite.sql \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c:<\/p>\n<pre><code class=\"sql\">CREATE TABLE IF NOT EXISTS member (     id           INTEGER NOT NULL PRIMARY KEY,     name         VARCHAR(255) );  CREATE TABLE IF NOT EXISTS sessions (     id           CHAR(72) PRIMARY KEY,     session_data TEXT );  CREATE TABLE IF NOT EXISTS entry (     entry_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,     body varchar(255) not null );  <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0431\u0430\u0437\u0443:<\/p>\n<pre><code class=\"bash\">sqlite3 development.db &lt; sqlite.sql   <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435<\/p>\n<pre><code class=\"bash\">cd config\/ vim  development.pl <\/code><\/pre>\n<p>  \u0412\u0442\u044b\u043a\u0430\u0435\u043c \u0432 \u043d\u0435\u0433\u043e \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433:<\/p>\n<pre><code class=\"perl\">use File::Spec; use File::Basename qw(dirname); my $basedir = File::Spec-&gt;rel2abs(File::Spec-&gt;catdir(dirname(__FILE__), '..')); my $dbpath = File::Spec-&gt;catfile($basedir, 'db', 'development.db'); +{     'DBI' =&gt; [         &quot;dbi:SQLite:dbname=$dbpath&quot;, '', '',         +{             sqlite_unicode =&gt; 1,         }     ], }; <\/code><\/pre>\n<p>  \u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0431 \u0441\u0435\u0440\u0432\u0435\u0440. <\/p>\n<pre><code class=\"bash\"> perl -Ilib script\/bbs-server Can't locate Teng\/Schema\/Declare.pm in @INC (you may need to install the Teng::Schema::Declare module) (@INC contains: script\/..\/lib lib \/etc\/perl \/usr\/local\/lib\/perl\/5.18.1 \/usr\/local\/share\/perl\/5.18.1 \/usr\/lib\/perl5 \/usr\/share\/perl5 \/usr\/lib\/perl\/5.18 \/usr\/share\/perl\/5.18 \/usr\/local\/lib\/site_perl .) at script\/..\/lib\/BBS\/DB\/Schema.pm line 6. BEGIN failed--compilation aborted at script\/..\/lib\/BBS\/DB\/Schema.pm line 6. Compilation failed in require at script\/..\/lib\/BBS.pm line 7. BEGIN failed--compilation aborted at script\/..\/lib\/BBS.pm line 7. Compilation failed in require at \/usr\/share\/perl\/5.18\/parent.pm line 20. BEGIN failed--compilation aborted at script\/..\/lib\/BBS\/Web.pm line 5. Compilation failed in require at script\/bbs-server line 9. BEGIN failed--compilation aborted at script\/bbs-server line 9. <\/code><\/pre>\n<p>  \u0418 \u043e\u0431\u043b\u0430\u043c\u044b\u0432\u0430\u0435\u043c\u0441\u044f. <br \/>  \u0425\u043e\u0440\u043e\u0448\u043e, \u0441\u0442\u0430\u0432\u0438\u043c   <\/p>\n<pre><code class=\"bash\">cpan Teng::Schema::Declare cpan Module::Functions cpan Plack::Middleware::ReverseProxy cpan Plack::Handler::Starlet <\/code><\/pre>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0437\u0430\u0432\u0435\u0442\u043d\u043e\u0435:<\/p>\n<pre><code class=\"bash\">dotcloud@debian:~\/BBS$ perl -Ilib script\/bbs-server BBS: http:\/\/127.0.0.1:5000\/ <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0437\u0430\u0439\u0442\u0438 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u043d\u0435\u0437\u0435\u043c\u043d\u0443\u044e \u043a\u0440\u0430\u0441\u043e\u0442\u0438\u0449\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage3\/729\/2e9\/737\/7292e97370c5acf9ca7d44710e561882.gif\"\/><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0445\u043e\u0437\u044f\u0439\u0441\u0442\u0432\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0412\u0412\u0421 \u2014 \u0434\u043e\u0441\u043a\u0443 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439 (<s>\u0431\u0430\u0431\u043a\u0443 \u0431\u0438\u0431\u0438\u0441\u0438\u0445\u0443 \u2014 \u0437\u043d\u0430\u0435\u0442\u0435 \u0442\u0430\u043a\u0443\u044e?<\/s>)<\/p>\n<pre><code class=\"bash\">vim lib\/BBS\/DB\/Schema.pm <\/code><\/pre>\n<p>  \u0418 \u043f\u043e\u0441\u0442\u0438\u043c \u0442\u0443\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"perl\"> package BBS::DB::Schema; use strict; use warnings; use utf8;  use Teng::Schema::Declare;  base_row_class 'BBS::DB::Row';  table {     name 'sessions';     pk 'id';     columns qw(session_data); };  table {     name 'entry';     pk 'entry_id';     columns qw(entry_id body); };  1; <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435:<\/p>\n<pre><code class=\"bash\">vim lib\/BBS\/Web\/Dispatcher.pm <\/code><\/pre>\n<pre><code class=\"perl\">package BBS::Web::Dispatcher; use strict; use warnings;  use Amon2::Web::Dispatcher::Lite;  any '\/' =&gt; sub {     my ($c) = @_;      my @entries = $c-&gt;db-&gt;search(         entry =&gt; {         }, {             order_by =&gt; 'entry_id DESC',             limit    =&gt; 10,         }     );     return $c-&gt;render( &quot;index.tx&quot; =&gt; { entries =&gt; \\@entries, } ); };    post '\/post' =&gt; sub {     my ($c) = @_;      if (my $body = $c-&gt;req-&gt;param('body')) {         $c-&gt;db-&gt;insert(             entry =&gt; +{                 body =&gt; $body,             }         );     }     return $c-&gt;redirect('\/'); };  1; <\/code><\/pre>\n<p>  \u0418 \u043f\u0440\u0430\u0432\u0438\u043c \u0442\u0435\u043c\u043f\u043b\u0435\u0439\u0442 <\/p>\n<pre><code class=\"bash\">vim tmpl\/index.tx <\/code><\/pre>\n<pre><code class=\"html\">: cascade &quot;include\/layout.tx&quot;  : override content -&gt; {  &lt;form method=&quot;post&quot; action=&quot;&lt;: uri_for('\/post') :&gt;&quot;&gt;     &lt;input type=&quot;text&quot; name=&quot;body&quot; \/&gt;     &lt;input type=&quot;submit&quot; value=&quot;Send&quot; \/&gt; &lt;\/form&gt;  &lt;ul&gt;     &lt;: for $entries -&gt; $entry { :&gt;     &lt;li&gt;&lt;: $entry.entry_id :&gt;. &lt;: $entry.body :&gt;&lt;\/li&gt;     &lt;: } :&gt; &lt;\/ul&gt;  : } <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c:<\/p>\n<pre><code class=\"bash\">perl -Ilib script\/bbs-server <\/code><\/pre>\n<p>  \u0418 \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043e\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u044b<\/p>\n<pre><code class=\"bash\">cpan Router::Simple cpan Router::Simple::Sinatraish  cpan DBD::SQLite <\/code><\/pre>\n<p>  \u0423\u0420\u0410!<br \/>  \u0411\u0430\u0431\u043a\u0430 \u0431\u0438\u0431\u0438\u0441\u0438\u0445\u0430 \u2014 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442!<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage3\/6df\/d06\/e6a\/6dfd06e6ad5dcd32ef55954aa63a544e.gif\"\/><\/p>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u044d\u0442\u043e \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u043d\u0430 nginx<\/p>\n<h4>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c nginx \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0440\u043e\u043d\u0442\u044d\u043d\u0434\u0430<\/h4>\n<h5>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0435\u043b\u0430\u0435\u043c init \u0444\u0430\u0439\u043b, \u0438 \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0441\u044f \u043d\u0435 \u043e\u0442 \u0440\u0443\u0442\u0430<\/h5>\n<pre><code class=\"bash\">vim \/etc\/init.d\/plackup  <\/code><\/pre>\n<pre><code class=\"bash\">#!\/bin\/sh  PORT=5000 WORKERS=4 AMON_DIR=&quot;\/home\/dotcloud\/BBS&quot; AMON_APP=&quot;$AMON_DIR\/script\/bbs-server&quot; AMON_USER=&quot;dotcloud&quot; AMON_MODE=&quot;development&quot; website=&quot;cc_Website&quot; plackup=&quot;\/usr\/local\/bin\/plackup &quot; PID=$AMON_DIR\/logs\/plackup.$website.pid plackup_args=&quot;-E $AMON_MODE -p $PORT -s Starman --pid=$PID --workers $WORKERS -D&quot;  U=`id -un` if [ $U = root ]; then        WRPERM=`find $AMON_DIR\/ ! -user $AMON_USER | wc -l`        if [ &quot;$WRPERM&quot; != 0 ]; then                echo Fixing file ownership on $AMON_DIR                chown -R $AMON_USER.nginx $AMON_DIR        fi        cd \/        su $AMON_USER -s \/bin\/sh  $0 &quot;$@&quot;        exit elif [ $U != $AMON_USER ]; then        echo &quot;Should be run under $AMON_USER or root&quot;        exit 1 fi   lockfile=$AMON_DIR\/logs\/plackup.$website  start() {     [ -x $plackup ] || exit 5     [ -f $AMON_APP ] || exit 6     echo -n $&quot;Starting $website: &quot;     $plackup $plackup_args -a $AMON_APP 2&gt;&1 &gt; \/dev\/null     retval=$?     if [ $retval -eq 0 ]; then         echo OK         touch $lockfile     else         failure $&quot;Unable to start&quot;     fi     echo     return $retval }  stop() {     echo -n $&quot;Stopping $website: OK&quot;     if [ -f $PID ]; then         kill `cat $PID` &gt; \/dev\/null         retval=$?         [ $retval -eq 0 ] && rm -f $lockfile         echo         return $retval     fi     failure $&quot;pid $PID not found&quot;     echo     return 1 }  restart() {     stop     start }  case &quot;$1&quot; in     start)         $1         ;;     stop)         $1         ;;     restart)         $1         ;;     *)         echo $&quot;Usage: $0 {start|stop|restart}&quot;         exit 2 esac <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433 \u0432 nginx<\/p>\n<pre><code class=\"perl\">vim \/etc\/nginx\/conf.d\/virtual.conf <\/code><\/pre>\n<pre><code class=\"bash\">upstream amon {         server 127.0.0.1:5000; }  server {     listen          *:80;           location \/ {                 try_files \/empty  @backend;     }         location @backend {             proxy_set_header Host $http_host;             proxy_set_header X-Forwarded-Host $host;             proxy_set_header X-Real-IP $remote_addr;             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;             proxy_set_header X-Forwarded-Proto $scheme;             proxy_pass http:\/\/amon;     }   } <\/code><\/pre>\n<p>  \u0412\u0441\u0435 \u0433\u043e\u0442\u043e\u0432\u043e!<\/p>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043e\u043f\u044f\u0442\u044c-\u0442\u0430\u043a\u0438 \u0446\u0438\u0442\u0430\u0442\u0443 \u0438\u0437 \u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0441\u0435 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0438 \u043e\u0431 Amon2. \u0427\u0435\u043c \u043e\u043d \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 Perl-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u0434\u043b\u044f \u0432\u0435\u0431?<\/b><\/p>\n<div class=\"spoiler_text\">Amon2 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0432\u0435\u0431-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u041e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 Mojolicious<\/p>\n<p>  Mojolicious \u043d\u0435\u043f\u043b\u043e\u0445, \u0438 \u043c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0441\u0430\u043c \u043f\u043e\u0434\u0445\u043e\u0434. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0442\u0430\u043c \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c. \u0412 Amon2 \u0436\u0435 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u041c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043b\u043e\u043c\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f. \u041a\u043e\u0433\u0434\u0430 \u044f \u0440\u0435\u0448\u0443 \u0447\u0442\u043e-\u043b\u0438\u0431\u043e \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u044f \u0432\u044b\u043f\u0443\u0449\u0443 Amon3.<\/p>\n<p>  \u041e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 Catalyst<\/p>\n<p>  Catalyst \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 Moose, \u0430 Amon2 \u2014 \u043d\u0435\u0442. \u042d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u044f \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u043b\u0438\u0441\u044c \u0431\u044b\u0441\u0442\u0440\u043e.<\/p>\n<p>  \u041e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 Dancer<\/p>\n<p>  \u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 Amon2 \u0438 Dancer, \u0432\u043a\u043b\u044e\u0447\u0430\u044f Dancer2.<\/p><\/div>\n<\/div>\n<p>  \u0410\u0432\u0442\u043e\u0440 \u0441\u043a\u0440\u043e\u043c\u043d\u044f\u0433\u0430, \u043a\u043e\u043d\u0435\u0447\u043d\u043e. <\/p>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0435 \u0438\u043c\u0445\u043e:  <\/p>\n<ol>\n<li>\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0438 \u043f\u0440\u0430\u0432\u0434\u0430 \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0439<\/li>\n<li>\u041d\u0430\u043f\u0438\u0441\u0430\u043d \u044f\u043f\u043e\u043d\u0446\u0435\u043c, \u0441 \u0438\u0445 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u0435\u0440\u0444\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0437\u043c\u043e\u043c. \u042d\u0442\u043e \u043e\u0449\u0443\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u0434\u0435. <\/li>\n<li>\u0414\u0435\u0432\u0443\u0448\u043a\u0430 ( miyagawa ), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0430 plackup, \u0441 \u043d\u0438\u043c \u043a\u043e\u0440\u0435\u0448\u0438\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0434\u0432\u0430 \u0441\u0430\u043f\u043e\u0433\u0430 \u043f\u0430\u0440\u0430.<br \/>  \u0412\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0441\u0432\u044f\u0437\u043a\u0430 plackup + Amon2<\/li>\n<li>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0444\u0440\u0435\u0439\u0432\u043e\u0440\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044e\u0437\u0430\u044e\u0442 \u00ab\u0431\u043e\u043b\u0435\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u00bb \u043f\u043e \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u0438\u044e \u0430\u0432\u0442\u043e\u0440\u0430, \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u0440\u043e\u0448\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a, \u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435. <\/li>\n<li>\u0424\u0440\u0435\u0439\u0432\u043e\u0440\u043a \u2014 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u043e\u0432\u044b\u0439 \u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439, \u043d\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0433\u0440\u043e\u043c\u0430\u0434\u043d\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043d\u0430 cpan<\/li>\n<li>\u0412 \u0446\u0435\u043b\u043e\u043c \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435. <\/li>\n<\/ol>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/122611\/\"> http:\/\/habrahabr.ru\/post\/122611\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/8b1\/5c5\/487\/8b15c5487d60da0edb9fb09654b40092.png\"\/><\/p>\n<h5>INTRO<\/h5>\n<p>  \u0412 <a href=\"http:\/\/pragmaticperl.com\/issues\/11\/pragmaticperl-11-\u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e-\u0441-tokuhiro-matsuno.html#.Usvim0C2DeM\">\u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u044f\u043f\u043e\u043d\u0446\u0430 Tokuhiro Matsuno<\/a> \u043f\u0440\u043e\u0437\u0432\u0443\u0447\u0430\u043b\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0444\u0440\u0430\u0437\u0430:  <\/p>\n<blockquote><p>\u00ab\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f <b>\u0431\u043e\u043b\u0435\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a<\/b>. \u0412\u0441\u0435 \u044d\u0442\u043e <b>\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 Amon2<\/b>.\u00bb<\/p><\/blockquote>\n<p>  \u042f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0438\u043d\u0444\u044b \u043e\u0431 \u044d\u0442\u043e\u043c \u0432\u0435\u0431 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435. \u0418 \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430 Amon2, \u0447\u0438\u0441\u0442\u043e \u0434\u043b\u044f \u0441\u0435\u0431\u044f, \u0438, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u043a\u043e\u043c\u0443-\u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-122611","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/122611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=122611"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/122611\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=122611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=122611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=122611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}