共有ホスティングのMojolicious / PSGIアプリケーション

Mojoliciousについてはすでに多くの記事が執筆されており、このWebフレームワークの一般的な印象を得ることができます。 出版物を読むと、PSGI、スケーリング、Webサーバーとの対話、高負荷への対応など、アプリケーションの展開がいかに簡単かを理解できます。 もちろんこれはすべて良いことですが、何らかの理由で、通常の仮想ホスティングでアプリケーションを実行する方法に関する記事はありません。 とはいえ、単純にそれを行うのは下品だという事実によるのではないのでしょうか?



要件。





そうかもしれませんが、共有ホスティングはいくつかの要件を満たす必要があります。



一般に、それですべてです。 もちろん、Webディレクトリの外側のスペースを使用して、そこに必要なすべてのモジュールを保存できると便利です。 たとえば、このWebフレームワークのレビュー付きの記事を使用して、コンピューターにMojoliciousを既にインストールしていることを前提としています。



ホスティングでPSGIアプリケーションを実行するには、Plackをインストールし、mod_perlをサポートする必要があります。



Mojoliciousアプリケーション





まだ持っていない場合は、Habrahabrをチェックして、寛容性を確認することをお勧めします。 これを行うには、Mojolicious自体、お気に入りのIDE、および少しの忍耐が必要です。



アプリケーションワイヤーフレーム




最初のステップは、アプリケーションフレームワークを生成することです。 単一行アプリケーションの制限を超えて、DancerとMojoliciousの対立に終止符を打つため、Liteバージョンを放棄します。

habra@cynovg-notebook:~$ mojo generate app Habra [mkdir] /home/habra/habra/script [write] /home/habra/habra/script/habra [chmod] habra/script/habra 744 [mkdir] /home/habra/habra/lib [write] /home/habra/habra/lib/Habra.pm [mkdir] /home/habra/habra/lib/Habra [write] /home/habra/habra/lib/Habra/Example.pm [mkdir] /home/habra/habra/t [write] /home/habra/habra/t/basic.t [mkdir] /home/habra/habra/log [mkdir] /home/habra/habra/public [write] /home/habra/habra/public/index.html [mkdir] /home/habra/habra/templates/layouts [write] /home/habra/habra/templates/layouts/default.html.ep [mkdir] /home/habra/habra/templates/example [write] /home/habra/habra/templates/example/welcome.html.ep
      
      





エンターテインメントを妨害し、続行する場合は、サンプルを含むディレクトリを削除します。



アプリケーション設計




アプリケーションが「Hello、World!」よりも少し深刻になるように、Habrahabra検索を使用してスキルを練習することをお勧めします。 つまり、ユーザーに検索文字列を要求するには、それをHabrに渡し、応答を受け取ってユーザーに表示します。



少し始めましょう。検索クエリの入力フォームを生成し、ユーザーからデータを受信したときの反応としてスタブテンプレートを表示する方法を学びましょう。 これを行うには、入力フォーム、フォームテンプレート自体、および応答スタブへのルートが必要です。



持っているすべてのルートは、libディレクトリにあるHabra.pmモジュールに保存されます。このモジュールの内容は、生成後は次のようになります。

 package Habra; use Mojo::Base 'Mojolicious'; # This method will run once at server start sub startup { my $self = shift; # Documentation browser under "/perldoc" $self->plugin('PODRenderer'); # Router my $r = $self->routes; # Normal route to controller $r->get('/')->to('example#welcome'); } 1;
      
      





私たちは検索に従事しているので、コントローラーにSearchという名前を付け、そのルートをそれぞれsearch#defaultおよびsearch#resultという名前にすることは論理的です。 デフォルトでは、入力フォームを表示します:

  $r->route( '/' )->via('get')->to( 'search#default' );
      
      





入力フォーム用のテンプレートを作成し、/ templates / search / deafult.html.epに配置します。

 % layout 'default'; % title '  '; <form action='<% url_for %>' method='post'> <input type='text' name='q' placeholder='  ?'> <input type='submit' value='!'> </form>
      
      





Habra.pmモジュールから不要なものをすべて削除し、デフォルトルートを変更した後、モジュールは次のようになります。

 package Habra; use Mojo::Base 'Mojolicious'; sub startup { my $self = shift; my $r = $self->routes; $r->route( '/' )->via('get')->to( 'search#default' ); } 1;
      
      





同じ名前のディレクトリからコマンドラインからスクリプトを実行して、その動作を確認しましょう。

 morbo script/habra Server available at http://127.0.0.1:3000.
      
      





127.0.0.1haps000のブラウザから入力すると、入力フォームが表示されます。もちろん、どこかに行くとすぐにアプリケーションがクラッシュします。 これは、入力フォームからデータを転送するために使用されるpostメソッドのコントロールへのルートがないために発生します。 メインモジュールにルートを追加し、テンプレートに一時スタブテンプレートを追加しますこれを行うには、メインモジュールに次の行を追加します。

  $r->route( '/' )->via('post')->to( 'search#result' )
      
      





データ出力テンプレート、templates / search / result.html.epを作成します

 % layout 'default'; % title ' ';
      
      





ここでアプリケーションの動作を確認すると、どこかに行きたいという要望に対する反応として、「検索結果」という見出しの空白ページがあることがわかります。



目標を達成するには、結果メソッドをコントロールに実装する必要があります。このメソッドは、リクエストを受け入れ、Habrに送信し、Habrからの応答を私たちにとって便利なフォームに変換します。 これを行うには、次の内容のlib / Habra / Search.pmモジュールを作成します。

 package Habra::Search; use Mojo::Base 'Mojolicious::Controller'; sub result { my $self = shift; my $str = $self->param( 'q' ); my $ua = Mojo::UserAgent->new; my $dom = $ua->get( 'http://habrahabr.ru/search/?q='.$str )->res->dom; my $pull = (); for my $raw ( $dom->find( 'div[id^="post"]' )->each ) { my $header= $raw->find( 'a[class="post_title"]' )->first; push @$pull, { title => $header->text, url => $header->{href}, content => $raw->find( 'div[class^="content"]' )->first->text }; } $self->render( result => $pull ); } 1;
      
      





スタブテンプレートを補完して、リクエストの結果を表示します。

 % layout 'default'; % title ' '; <ul> % for my $row ( @$result ) { <li> <h2><%= $row->{title} %></h2> <p><%= $row->{content} %></p> <p>  : <a href="<%= $row->{url} %>"><%= $row->{url} %></a></p> </li> %} </ul>
      
      





データを抽出するためのより単純な、またはあなたの意見ではより「正しい」方法があれば、私はそれについて知りたいです。



最初の知り合いにはこれで十分だと思いますが、アプリケーションはまだローカルマシン上にあるため、この段階ではまだ主な目標に到達していません。 共有ホスティングで起動するときが来ました。



アプリケーションを公開





この段階で、要件を満たしたホスティングと動作するアプリケーションができました。 小規模の場合は引き続き、公開してください。 そうそう、mojoex.am.plというドメイン名があり、サイトへのパスが/home/mojoex.am.pl/wwwであると仮定しましょう。



アプリケーションを実行するには、たとえばGitHubからMojoliciousソースコードをダウンロードする必要があります

 git clone https://github.com/kraih/mojo.git
      
      





次に、すべてのモジュールが格納される場所であるlibディレクトリのみを残し、ディストリビューションから不要なものをすべて削除します。 アプリケーションモジュールとMojolishes自体のモジュールを混同しないように、たとえばmojoでlibディレクトリの名前を変更できます。



次のステップでは、ヘッダーにModzholisisモジュールとアプリケーション自体を含むディレクトリへのポインターを追加して、アプリケーションを起動するスクリプトをわずかに変更し、habra.cgiに名前を変更します。

 use lib ( '/home/mojoex.am.pl/mojo' ); use lib ( '/home/mojoex.am.pl/lib' );
      
      





次のステップでは、Mojolishesモジュールをサイトの外部に、パス/home/mojoex.am.pl/mojoに沿って配置します。 同様に、アプリケーションモジュールとテンプレート、それぞれ/home/mojoex.am.pl/libと/home/mojoex.am.pl/templatesをレイアウトします。 また、ログ用のディレクトリ/home/mojoex.am.pl/logを作成します。 ただし、アプリケーションを起動するスクリプトは、ディレクトリ/home/mojoex.am.pl/www/cgi-binに配置し、実行する権利が必要です。



最後のステップは、mod_rewriteを使用した魔法です。 これを行うには、.htaccessファイルを作成します。このファイルは、/ home / mojoex.am.pl / wwwディレクトリにあり、次の内容が含まれている必要があります。

 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-l RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /cgi-bin/habra.cgi/$1 [L] RewriteRule ^$ /cgi-bin/habra.cgi [L]
      
      







frenzytechnix mod_perlがホスティングにインストールされている場合、PSGIアプリケーションを実行できるというヒント。 これを行うには、.htaccessで次を指定します。

 <Perl> $ENV{PLACK_ENV} = 'production'; $ENV{MOJO_HOME} = '/home/mojoex.am.pl'; $ENV{MOJO_TEMPLATE_CACHE} = 0; $ENV{PERL5LIB} .= '/home/mojoex.am.pl/lib;/home/mojoex.am.pl/mojo' </Perl> SetHandler perl-script PerlHandler Plack::Handler::Apache2 PerlSetVar psgi_app /home/mojoex.am.pl/www/cgi-bin/habra
      
      







あなたはサイトのメインページに行くことで見ることができるように、これで私たちの試練はすべて終了するはずです。 すべてが正しく行われると、検索用のデータを入力するプロンプトが表示されます。 これが発生しなかった場合は、サーバーエラーログで理由を確認する必要があります。ほとんどの場合、問題はアプリケーション起動スクリプトへのアクセスです。



まとめ





その結果、ホスティング構造は次のようになります。

 /home/mojoex.am.pl/ #   /home/mojoex.am.pl/mojo/ #    Mojolicious /home/mojoex.am.pl/lib/ #     /home/mojoex.am.pl/log/ #      /home/mojoex.am.pl/www/.htaccess #     mode_rewrite /home/mojoex.am.pl/www/cgi-bin/habra.cgi # ,  
      
      





スタイル、画像などの静的ファイルは通常の方法で保存されます。.htaccessのルールのおかげで、リダイレクト時に無視されます。 存在しないリソースにアクセスすると、アプリケーションへのリダイレクトが行われ、それによって何をすべきかが個別に決定されます。 指定されたパスに沿ってアピールが発生した場合、コントロールはコントロールに転送されます。それ以外の場合は、エラーメッセージが生成されます。エラーメッセージは個別に生成できます。



誰かがコードの断片を激怒する場合、または理解できない点、コメント、提案がある場合は、コメントを残してください。



All Articles