问题描述
我计划使用PSGI / Plack开发一个Web应用程序。 (可能与
Dancer达成协议,但尚未决定)。
I plan develop one web application with PSGI/Plack. (probaly withDancer, but not decided yet).
应用程序应为utf8,多语言(使用Locale :: Maketext)和(ofc)将包含给定语言的一些静态页面。我的想法是将其部署到不同的语言域中,例如 en.example.com
, de.example.com
等。应用程序本身很简单,通常只会用本地化的文本和一些其他(轻型)功能填充模板。
The applicatiion should be utf8, multilingual (with Locale::Maketext) and (ofc) will contain some statical pages in the given language. My idea is deploy it in different language domains like en.example.com
, de.example.com
etc. The application itself is simple, mostly will only fill templates with localized texts and some other (light) functionality.
什么是部署一个的最佳解决方案>在一个物理机上应用基于多个语言的子域?
What is the best solution to deploying one application for mutiple language-based sub-domains in one physical machine?
我目前的研究以该解决方案结束:需要为每台服务器使用Apache及其基于名称的虚拟服务器语言子域。
My current research ended with this solution: need to use Apache and its name based virtual servers for every language subdomain.
<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或其他pure-perl服务器一起存在任何解决方案吗?如果是,怎么办?反向代理?
- 纯perl解决方案会更好(更快)吗?
- 我应该考虑其他解决方案吗? (fcgi,nginx等...)
- What is the best solution?
- Exists any solution with Starman or other pure-perl server? If yes, how? Reverse proxy?
- Will be the pure perl solution better (faster)?
- should i consider some other solution? (fcgi, nginx etc...)
任何可能对发展本身产生影响的想法/事物 >?
推荐答案
使用Plack :: App :: URLMap在Starman(或任何与PSGI兼容的网络服务器)中设置虚拟主机:
Use Plack::App::URLMap to setup a virtualhost in Starman (or whatever PSGI compatible web servers):
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中间件来实现,例如:
in generate_app
you can setup/configure whatever needed to return a new PSGI app. If you want to share the same $app instance but want to dynamically change the behavior, you can do so by writing PSGI middleware, like:
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:
标头照原样转发到后端。
Note that you probably want to put Starman behind proxy, in which case you should configure the frontend (nginx/Apache/lighttpd etc.) to forward the Host:
header as it is to the backend.
这篇关于多语言PSGI-Web部署的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!