簡體   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