【问题标题】:Mojolicious in Apache mod_perlApache mod_perl 中的 Mojolicious
【发布时间】:2017-06-07 16:22:48
【问题描述】:

我有一个大约 15 岁的 Perl 应用程序。 该应用程序在 Apache 上运行,示例代码如下所示:

use Apache2::RequestUtil ();
use Apache2::RequestRec ();
use Apache2::Const -compile => qw(OK);

sub handler {
  my $r = shift;
  Apache2::RequestUtil->request($r)                                     
  $r->subprocess_env;                      

  $r = Apache2::RequestUtil->request; 

  $r->content_type("text/html");
  $r->print("Hello World");
  };

 return Apache2::Const::OK;              
}
1;

这可行,但现在我想将 Mojolicious 用于此应用程序的新功能。 但是我怎样才能将 Mojolicious 集成到这个应用程序中呢? 当我执行以下操作时

    use Apache2::RequestUtil ();
use Apache2::RequestRec ();
use Apache2::Const -compile => qw(OK);

sub handler {
  my $r = shift;
  Apache2::RequestUtil->request($r                                     
  $r->subprocess_env;                      

  $r = Apache2::RequestUtil->request; 

  get '/:foo' => sub {
    my $self = shift;
    my $foo  = $self->param('foo');
    $self->render(text => "Hello from $foo.");
  };

 return Apache2::Const::OK;              
}
app->start;
1;

我得到一个空白页。是否可以将 Mojo 集成到我的应用中?

【问题讨论】:

  • 您在第二个示例中是否加载了任何与 mojo 相关的内容?看起来不像。它怎么知道有get 函数? Mojolicious 有一种与 mod_perl 接口的方法。我不知道它是如何工作的,但有文档。我怀疑它可以通过 PSGI 工作。您可能会将您的新功能放入一个单独的应用程序中,该应用程序可以进入它自己的文件,在此处加载并使用它。
  • 对不起,有使用 Mojolicious::Lite;在第二个例子中。刚刚忘记复制了。
  • edit 并包含更多该代码。如果有的话,也是一个包名。

标签: apache perl mojolicious mod-perl


【解决方案1】:

如果您想要 Mojolicious 的好处,您不应该直接使用 Apache 请求。

首先您需要一个特殊的虚拟主机配置。请参阅https://github.com/kraih/mojo/wiki/Apache-deployment 并向下滚动到 Apache/mod_perl (PSGI/Plack) 一章。我撰写了这一章,因为我在 mod_perl 下运行了十几个 Mojo 应用程序,并且需要反复试验才能找到一种可行的方法。

这里以 Apache 配置文件为例:

<VirtualHost *:80>
  ServerName myapp.local
  DocumentRoot /home/sri/myapp

  PerlOptions +Parent

  <Perl>
    $ENV{PLACK_ENV} = 'production';
    $ENV{MOJO_HOME} = '/home/sri/myapp';
    $ENV{MOJO_MODE} = 'deployment';
  </Perl>

  <Location />
    SetHandler perl-script
    PerlResponseHandler Plack::Handler::Apache2
    PerlSetVar psgi_app /home/sri/myapp/script/myapp
  </Location>
</VirtualHost>

您的第二个模块MyApp.pm 应如下所示:

package MyApp;
use Mojo::Base 'Mojolicious';

sub startup {
  my $app = shift;

  my $routes = $app->routes;

  $routes->get('/:foo' => sub {
    my $self = shift;
    my $foo  = $self->param('foo');
    $self->render(text => "Hello from $foo.");
  });

}

1;

这就是你所需要的。 Plack::Handler::Apache2mod_perlMojolicious 之间构建一个层。当然你需要一个脚本myapp。此脚本还允许您从桌面的控制台运行 Web 应用程序 e。 G。在开发和测试期间。

【讨论】:

  • 很好的解释。 :)
  • 嗨。谢谢。一个问题,我像您的示例一样创建了一个虚拟主机(但仅使用端口 8080,因为另一个 Webapp 在 80 上运行。在文件夹 home 中,我创建了一个名为“sri”的文件夹,并在此文件夹中创建了一个文件夹“myapp” . 在这个文件夹中,我使用您的内容创建了 MyApp.pm。但是如果我运行 server:8080 我得到“无法访问此站点”路径有问题吗?
猜你喜欢
  • 2020-08-13
  • 2012-06-23
  • 2014-06-21
  • 2011-12-07
  • 2015-01-05
  • 2011-09-14
  • 2014-09-02
  • 2015-02-24
  • 2010-12-13
相关资源
最近更新 更多