0

同じマシン上で実行される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アプリにプロキシする方法はありますか?

4

2 に答える 2

3

Unix ドメイン ソケットへのプロキシは、Apache 2.4.7 およびStarman以降、 mod_proxyで機能するはずです。

もう 1 つの方法は、さまざまな PSGI アプリを 1 つのプロセスで実行することです。これを実現するために、次のラッパー アプリに似たものを使用します。

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

私が抱えていた唯一の問題は、一部のアプリが同じ名前の異なるバージョンのローカル モジュールを使用していたことです。すべてがうまくいったことを修正した後。

このアプローチの大きな利点は、すべてのアプリでワーカーを共有できるため、メモリ使用量を削減できる (またはワーカーを追加できる) ことです。

于 2015-03-09T14:06:30.843 に答える
2

試したことはありませんが、Apache がドメイン ソケットにプロキシできるようにするmod_proxy_fdpassがあります。

個人的には、型にはまらないことをする価値のあるオーバーヘッドを測定できない限り、標準のポートごとのアプリの配置を使用することをお勧めしました。

アプリごとにサーバーへのプライベート IP アドレスを 1 つ使用し、それらすべてをプライベート IP のポート 80 で実行するオプションもあります。

于 2013-02-07T01:43:40.600 に答える