问题描述
我计划使用 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 等...)
还有什么其他想法/事情会对开发本身产生影响?
推荐答案
使用 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: 标头原样转发到后端.