我们有许多(孤立的)安装PSGI应用程序,它们运行在同一台机器上,因此需要它们的PSGI服务器在独特的端口上运行。从资源/管理的角度来看,这并不理想,但它也需要TCP/IP的“开销”(尚未测量到,也可能微不足道),因为在同一台计算机上运行Unix域套接字似乎是更明显的选择。
幸运的是,该应用程序在Plack的HTTP接口下工作(通过mod_proxy的“ProxyPass”从Apache代理),但不幸的是,它在FastCGI接口下中断(参见:https://stackoverflow.com/questions/14643165/can-psgi-apps-fork-under-plackhandlerfcgi)。
除了mod_ patching的FastCgiExternalServer (或者用这个未经测试的、用户贡献的修补程序:mbox/httpd-dev/201207.mbox/%3C20120731200351.GB11038@gmail.com%3E)修补mod_proxy之外,有没有办法通过Unix域套接字将Apache连接代理到PSGI应用程序?
发布于 2015-03-09 14:06:30
代理到Unix域套接字应该可以使用代理,因为Apache2.4.7和史达曼。
另一种方法是在一个进程中运行不同的PSGI应用程序。为了实现这一点,我使用了类似于以下包装程序的工具:
use strict;
use warnings;
use lib qw(
/path/to/app1
/path/to/app2
/path/to/app3
);
use Plack::Builder;
use Plack::Util;
sub load_psgi_in_dir {
my ($dir, $psgi) = @_;
my $app = Plack::Util::load_psgi("$dir/$psgi");
return sub {
chdir($dir);
return $app->(@_);
};
}
builder {
mount 'http://app1.com/' => load_psgi_in_dir(
'/path/to/app1',
'app1.psgi',
);
mount 'http://app2.com/' => load_psgi_in_dir(
'/path/to/app2',
'app2.psgi',
);
mount 'http://app3.com/' => load_psgi_in_dir(
'/path/to/app3',
'app3.psgi',
);
};我唯一的问题是,有些应用程序使用了同名的本地模块的不同版本。修复后一切都很好。
这种方法的一个相当大的好处是,您可以在所有应用程序之间共享工作人员,从而减少内存使用(或使您能够添加更多的工作人员)。
发布于 2013-02-07 01:43:40
fdpass允许Apache代理域套接字,尽管我还没有尝试过。
我个人建议使用标准的每个应用程序的端口安排,除非你可以衡量的开销是值得做一些非常规的事情。
您还可以选择在每个应用程序中使用一个私有到服务器的IP地址,并让它们在它们的私有IP上运行在端口80上。
https://stackoverflow.com/questions/14648515
复制相似问题