我计划使用 PSGI/Plack 开发一个 Web 应用程序。 (可能与
舞者,但尚未决定)。
应用程序应该是 utf 8、多语言(使用 Locale::Maketext)并且 (ofc) 将包含一些给定语言的静态页面。我的想法是将其部署在不同的语言域中,例如en.example.com
, de.example.com
应用程序本身很简单,大多数只会用本地化文本和一些其他(轻)功能填充模板。
最佳的部署解决方案是什么one在一台物理机上应用多个基于语言的子域?
我当前的研究以这个解决方案结束:需要为每个语言子域使用 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;
in 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:
标头与后端一样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)