我计划用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>
问题:
可能对开发本身产生影响的任何其他想法/事物?
答案 0 :(得分: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:
标头转发到后端。
答案 1 :(得分: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的共享。
最终,这取决于你对更好的需求。