7

我计划用 PSGI/Plack 开发一个 Web 应用程序。(可能与舞者,但尚未决定)。

应用程序应该是 utf8,多语言(使用 Locale::Maketext)和(ofc)将包含给定语言的一些静态页面。我的想法是将其部署在不同的语言域中en.example.com,例如de.example.com等。应用程序本身很简单,大多数情况下只会用本地化文本和其他一些(轻量级)功能填充模板。

在一台物理机上为多种基于语言的子域部署一个应用程序的最佳解决方案是什么?

我目前的研究以这个解决方案结束:需要为每个语言子域使用 Apache 及其基于名称的虚拟服务器。

<VirtualHost en.example.com>
    ServerName en.example.com
    DocumentRoot /path/to/site/en/files
    <Location />
        SetHandler perl-script
        PerlResponseHandler Plack::Handler::Apache2
        PerlSetVar psgi_app /path/to/site/en/en.psgi
    </Location>
</VirtualHost>

问题:

  • 什么是最好的解决方案?
  • Starman 或其他纯 perl 服务器是否存在任何解决方案?如果是,如何?反向代理?
  • 纯 perl 解决方案会更好(更快)吗?
  • 我应该考虑其他解决方案吗?(fcgi、nginx 等...)

还有什么其他想法/事情会对发展本身产生影响吗?

4

2 回答 2

8

使用 Plack::App::URLMap 在 Starman(或任何与 PSGI 兼容的 Web 服务器)中设置虚拟主机:

use Plack::App::URLMap;
my $en_app = generate_app('en');
my $ru_app = generate_app('ru');

my $app = Plack::App::URLMap->new;
$app->map("http://en.example.com/" => $en_app);
$app->map("http://ru.example.com/" => $ru_app);
$app->to_app;

generate_app您可以设置/配置返回新 PSGI 应用程序所需的任何内容。如果你想共享同一个 $app 实例但想动态改变行为,你可以通过编写 PSGI 中间件来实现,例如:

my $app = sub { MyApp->run(@_) };
my $en_app = sub {
   my $env = shift;
   $env->{'myapp.language'} = 'en';
   $app->($env);
};
my $ru_app = sub { ... }; # same

请注意,您可能希望将 Starman 放在代理后面,在这种情况下,您应该配置前端(nginx/Apache/lighttpd 等)以将Host:标头原样转发到后端。

于 2011-05-18T22:02:35.630 回答
3

我不认为有一种“最好”的方式,只是有很多不同的方式,而且每种方式都有优点/缺点。

像你一样设置 Apache 是可能的,我不明白为什么这应该是一个坏方法。另一种方法是将每个应用程序“挂载”到路径。这在这里进一步描述:http: //suryahunter.com/wiki/hunter/perl_ironman/mount_multiple_apps_with_plack

如果您通常使用 PSGI/Plack,那么您可以使用任何 Web 服务器,也可以使用 Starman 或其他 Perl Web 服务器。你使用哪一个取决于你。使用你认为性能最好的那个,或者你最了解的那个。

还要考虑当您启动服务器时,您可能希望自动启动您的应用程序,而 Apache、Nginx、LightTPD... 已经有启动脚本。如果您还想托管其他网站,那么使用这些 Web 服务器之一可能会更好。

我更喜欢 FastCGI 来运行你的应用程序。使用 FastCGI,您的应用程序独立于您的 Web 服务器运行,并且还可以使用其他用户权限运行,而不是 mod_perl,所有应用程序都在与 Apache 用户相同的用户下运行。它还为您提供了无需重新启动整个 Web 服务器 (Apache) 即可重新启动应用程序的优势。

好吧,通过这种独立,您可能需要更多 RAM 来运行相同数量的应用程序,因为您多次启动应用程序,而不是使用为您提供 Apache/mod_perl 的共享。

最后,这取决于您对更好的需求。

于 2011-05-18T11:22:45.750 回答