web-dev-qa-db-fra.com

NGINX - Reverse proxy multiple API sur différents ports

J'ai les API suivantes:

  1. localhost: 300/api/clients /
  2. localhost: 400/api/clients /: id/facturation
  3. localhost: 500/api/commandes

Je voudrais utiliser NGINX pour les exécuter tous sous l'emplacement suivant:

localhost: 443/api /

Cela semble très difficile car les clients s'étendent sur deux serveurs.

Voici ma tentative ratée en commençant par les commandes

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;
    }
}

Quelque chose saute aussi loin qu'une solution? Merci!

15
Proximo

Les trois services sont mandatés par le même serveur (en ce qui concerne nginx) et doivent donc être structurés en trois blocs location dans un bloc server. Voir ce document pour plus de détails.

Si vous passez simplement l'URI d'origine non modifié, vous n'avez pas besoin de spécifier un URI sur l'instruction proxy_pass.

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;
    }
}

Si les instructions proxy_set_header Sont identiques, elles peuvent être spécifiées une fois dans le bloc parent.

Le type d'instruction location requis dépend de la plage d'URI traités par le service localhost:300/api/customers/. S'il s'agit d'un seul URI, la syntaxe = Fonctionnera. S'il s'agit d'un URI qui ne correspond pas à /api/customers/:id/billing, Vous devrez utiliser un bloc d'emplacement d'expression régulière. Voir ce document pour plus de détails.

Je ne suis pas sûr que cela fonctionnera sauf si vous résiliez SSL ici. C'est-à-dire configurer le proxy inverse en tant que serveur sécurisé .

16
Richard Smith

La réponse acceptée n'a pas fonctionné pour moi; J'avais trois serveurs fonctionnant en tant que service Kubernetes mappés à différentes adresses IP de cluster (accessibles uniquement à partir des nœuds Kubernetes). J'ai donc utilisé l'IP de la machine hôte - 10.ttt.ttt.104 et la configuration suivante pour pouvoir accéder à ces services depuis mon réseau professionnel.

Je ne suis pas un expert nginx de quelque longueur que ce soit - mais cela a fonctionné - alors utilisez-le comme base peut-être

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