【问题标题】:Apache-to-PSGI proxy over a Unix domain socket基于 Unix 域套接字的 Apache-to-PSGI 代理
【发布时间】:2013-02-01 14:29:43
【问题描述】:

我们有许多(隔离的)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)之外,还有什么方法可以将 Apache 连接通过 Unix 域套接字 代理到 PSGI 应用程序?

【问题讨论】:

    标签: perl apache proxy psgi


    【解决方案1】:

    自 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',
        );
    };
    

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

    这种方法的一个相当大的好处是,您可以在所有应用程序之间共享工作器,从而减少内存使用量(或使您能够添加更多工作器)。

    【讨论】:

      【解决方案2】:

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

      我个人建议使用标准的 each-app-on-a-port 安排,除非您可以衡量开销是否值得做一些非常规的事情。

      您还可以选择为每个应用程序使用一个专用于服务器的 IP 地址,并让它们都在其专用 IP 的端口 80 上运行。

      【讨论】:

        猜你喜欢
        • 2016-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-02
        • 2014-06-02
        • 1970-01-01
        相关资源
        最近更新 更多