web-dev-qa-db-ja.com

NGINX-異なるポートでの複数のAPIのリバースプロキシ

私は次のAPIを持っています:

  1. localhost:300/api/customers /
  2. localhost:400/api/customers /:id/billing
  3. localhost:500/api/orders

NGINXを使用して、次の場所ですべて実行できるようにしたいと思います。

localhost:443/api /

顧客が2つのサーバーにまたがっているため、これは非常に難しいようです。

これが注文から始まった失敗した試みです

server {
    listen 443;
    server_name localhost;

    location /api/orders {
            proxy_pass https://localhost:500/api/orders;
            proxy_set_header Host $Host;
            proxy_set_header X-Forwarded-For $remote_addr;
    }
}


server {
    listen 443;
    server_name localhost;

    location /api/customers/$id/billing {
            proxy_pass https://localhost:400/api/customers/$id/billing;
            proxy_set_header Host $Host;
            proxy_set_header X-Forwarded-For $remote_addr;
    }
}

server {
    listen 443;
    server_name localhost;

    location /api/customers {
            proxy_pass https://localhost:300/api/customers;
            proxy_set_header Host $Host;
            proxy_set_header X-Forwarded-For $remote_addr;
    }
}

修正するまで何かが飛び出しますか?ありがとう!

15
Proximo

3つのサービスは同じサーバーによってプロキシされているため(nginxに関する限り)、1つのlocationブロック内の3つのserverブロックとして構成する必要があります。詳細は このドキュメント を参照してください。

元のURIを変更せずにそのまま渡す場合は、proxy_passステートメントでURIを指定する必要はありません。

server {
{
    listen 443;
    server_name localhost;

    proxy_set_header Host $Host;
    proxy_set_header X-Forwarded-For $remote_addr;

    location /api/orders {
        proxy_pass https://localhost:500;
    }
    location /api/customers {
        proxy_pass https://localhost:400;
    }
    location = /api/customers {
        proxy_pass https://localhost:300;
    }
}

proxy_set_headerステートメントが同一の場合、それらを親ブロックで一度指定できます。

必要なlocationステートメントのタイプは、localhost:300/api/customers/サービスによって処理されるURIの範囲によって異なります。 1つのURIの場合、=構文が機能します。 /api/customers/:id/billingに一致しないURIの場合は、正規表現のロケーションブロックを使用する必要があります。詳細は このドキュメント を参照してください。

ここでSSLを終了しない限り、これが機能するかどうかはわかりません。つまり、 セキュアサーバーとしてのリバースプロキシ を構成します。

16
Richard Smith

受け入れられた答えは私にとってはうまくいきませんでした。 Kubernetesサービスとして実行されている3つのサーバーを異なるクラスターIPにマップしました(Kubernetesノードからのみアクセス可能)。そこで、ホストマシンのIPを使用しました-10.ttt.ttt.104と次の設定を使用して、仕事用ネットワークからこれらのサービスにアクセスできるようにします。

私はnginxのエキスパートではありませんが、これはうまくいきました。ベースとして使用してください。

events {
  worker_connections  4096;  ## Default: 1024
}
http{
    server {
       listen 80;
       listen [::]:80;

       server_name 10.ttt.ttt.104;
       proxy_set_header Host $Host;
       proxy_set_header X-Forwarded-For $remote_addr;

       location / {
           proxy_pass http://10.103.152.188:80/;
       }
     }

    server {
       listen 9090;
       listen [::]:9090;

       server_name 10.ttt.ttt.104;
       proxy_set_header Host $Host;
       proxy_set_header X-Forwarded-For $remote_addr;

       location / {
           proxy_pass http://10.107.115.44:9091/;
       }
     }

    server {
       listen 8080;
       listen [::]:8080;

       server_name 10.ttt.ttt.104;
       proxy_set_header Host $Host;
       proxy_set_header X-Forwarded-For $remote_addr;

       location / {
           proxy_pass http://10.105.249.237:80/;
       }
     }
}
0
Alex Punnen