サーバーのホスト名によるリバース TCP プロキシ ポート 80 および 443

サーバーのホスト名によるリバース TCP プロキシ ポート 80 および 443

パブリック IP アドレスが 1 つあります。ポート 80 および 443 のパブリック IP 経由で、要求されたサーバー名によって区別される複数のサービスへのアクセスを許可しようとしています。

ただし、1つのサービスにはTCPリバース プロキシをパブリック IP のポート 80 と 443 で動作させる必要があります。別のサイトでは TCP リバース プロキシが必要ですが、ポート 443 のみで動作します。残りは単なる Web サイトなので、http リバース プロキシで問題ありませんが、訪問者や letsencrypt にとって使いやすいように、Web サイトをポート 80 と 443 でパブリックにアクセスできるようにしたいと考えています。

シンプルさを保つために、必要な数の VM とプライベート IP を起動できますが、パブリック IP アドレスは 1 つに制限されます。

SNI を使用したリバース プロキシとして nginx をセットアップしてこれを行うことはできますか? 理論的には、適切なサーバーに向けられた SNI を使用してホスト名ですべてを TCP ストリームし、必要な Web サイトを別のポートでリッスンするようにセットアップした 2 番目の Web サーバーを使用できるはずです。たとえば、nginx.conf は次のようになります。

stream {

    map $ssl_preread_server_name $name {
            serviceone.domain.tld serviceone;
            servicetwo.domain.tld servicetwo;
            website1.domain.tld website1;       
            website2.domain.tld website2;   
    }

    upstream serviceone {
            server 10.1.99.7:443;
    }

    upstream servicetwo {
            server 10.1.99.20:443;
    }

    upstream website1 {
            server 10.1.99.30:10443;
    }

    upstream website2 {
            server 10.1.99.30:10444;
    }


    server {
            listen 443;
            listen 80;
            resolver 8.8.8.8;

            proxy_pass $name;
            ssl_preread on;
    }

}

私の nginx.conf には上記と同様のものが動作していますが、ポート 80 のリクエストがどのように方程式に組み込まれるのか理解するのに少し苦労しています (サーバー ブロックに listen 80 を貼り付けただけですが、同じサーバー名が要求された場合に 443 と 80 を区別するという観点からリクエストがどのように処理されるのか説明できませんでした)

nginx や haproxy などを使用して、より良い方法も検討します。ありがとうございます!

答え1

ホスト名ごとに個別の server{...} ブロックを使用します。

これは追加モジュールに依存せずに機能し、上流サーバーがプロキシに必要な構成と異なる場合に、多くの苦労を軽減します。

関連情報