繁体   English   中英

Unix域套接字上的Apache到PSGI代理

[英]Apache-to-PSGI proxy over a Unix domain socket

我们在同一台计算机上运行了很多(单独的)PSGI应用程序,因此需要它们的PSGI服务器在唯一的端口上运行。 从资源/管理的角度来看,这不是理想的选择,但是当在同一台机器上运行Unix域套接字似乎是更明显的选择时,它还需要TCP / IP的(尚未测量且可能不重要的)“开销”。 。

幸运的是,该应用程序可以在Plack的HTTP接口下运行(通过mod_proxy的“ ProxyPass”从Apache代理),但是不幸的是,它在FastCGI接口下无法正常工作(请参阅: https : //stackoverflow.com/questions/14643165/can-psgi-apps- fork-under-plackhandlerfcgi )。

除了mod_fastcgi的FastCgiExternalServer(或使用未经测试的,用户提供的补丁来修补mod_proxy: http ://mail-archives.apache.org/mod_mbox/httpd-dev/201207.mbox/%3C20120731200351.GB11038@gmail.com%3E) ,是否可以通过Unix域套接字将Apache连接代理到PSGI应用?

从Apache 2.4.7和Starman开始,代理到Unix域套接字应该与mod_proxy一起使用。

另一种方法是在单个过程中运行不同的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',
    );
};

我唯一的问题是某些应用程序使用了具有相同名称的本地模块的不同版本。 修复后,一切正常。

这种方法的显着优点是您可以在所有应用程序之间共享工作程序,从而减少了内存使用(或使您可以添加更多工作程序)。

mod_proxy_fdpass ,它允许Apache代理到域套接字,尽管我还没有尝试过。

我个人建议使用标准的每端口逐个应用程序安排,除非您可以衡量开销以值得做一些非常规的事情。

您还可以选择为每个应用使用一个私有的服务器IP地址,并使它们全部在其私有IP的端口80上运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM