3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Mojoliciousアプリをプレフィックス付きで起動

Last updated at Posted at 2014-06-18

Mojoliciousでアプリを開発後、本番運用時に別のパスで運用したい時の為に、prefixを付ける方法を実験してみた
結果からいうとMojolicious::Plugin::Mountを使ったMojolicious::Liteアプリを作成するとよいみたいです。

例では全てPSGIだが他の起動方法でも同じでいいはず

###上手くいった例

script以下の↓こんな感じのコードを準備します。
target_appが作成したアプリの起動スクリプト。

prefix.psgi
#!/usr/bin/env perl
use Mojolicious::Lite;
use Plack::Builder;

use FindBin;
BEGIN {
  unshift @INC, "$FindBin::Bin/../lib";
  $ENV{MOJO_HOME} ||= "$FindBin::Bin/..";
}

my $prefix = $ENV{MOJO_PREFIX} || "/prefix/";
plugin Mount => { $prefix => app->home->rel_file("target_app") };

get '/' => sub { shift->redirect_to($prefix); };

builder {
  require Mojo::Server::PSGI;
  Mojo::Server::PSGI->new(app => app)->to_psgi_app;
}

静的ファイルのパスはurl_for()を使う

default.html.ep
<html>
 <head>
  <meta charset="utf-8" />
  <title><%= title %></title>

  %# '/js/jquery.js' → url_for('/js/jquery.js')
  %= javascript url_for('/js/jquery.js')
  %# '/css/main.css' → url_for('/css/main.css')
  %= stylesheet url_for('/css/main.css')
 </head>
 <body>
...
 </body>
</html>

javascriptstylesheetなどのMojoliciousのタグヘルパーは
url_for()を使わないとプレフィックスを補完してくれないので
url_for()を使っておく必要がある

plackupで起動

% plackup script/prefix.psgi

プレフィックスを変更する場合、/other_prefix/の様に末尾に"/"を付けること

% env MOJO_PREFIX="/other_prefix/" plackup script/prefix.psgi

###ダメだった例

routesにbridgeを準備してアプリのrouteをbridge以下に格納する

Mojolicous_app

my $r = $self->mode eq "production" ? $self->routes->bridge("/prefix") : $self->routes;
$r->get("/")->to("target_ctl#sub1");
...

routeにはprefixが付くが静的ファイルにはprefixが付かない為、上手くいかなかった。

3
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?