NGINX - API-интерфейс обратного прокси-сервера на разных портах

У меня есть следующие API (ы):

  • localhost: 300/api/customers/
  • локальный: 400/API/клиентов/: идентификатор/биллинг
  • локальный: 500/API/заказы

Я хотел бы использовать NGINX, чтобы они все работали в следующем месте:

локальный: 443/API/

Это кажется очень сложным, потому что клиенты охватывают два сервера.

Здесь моя неудачная попытка, начинающаяся с заказов

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

Что-нибудь выпрыгивает до исправления? Спасибо!

Ответ 1

Три службы проксируются одним и тем же сервером (что касается nginx), поэтому должны быть структурированы как три блока location в одном блоке server. Подробности смотрите в этом документе.

Если вы просто передаете исходный URI без изменений, вам не нужно указывать URI в операторе 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;
    }
}

Если операторы proxy_set_header идентичны, их можно указать один раз в родительском блоке.

Тип требуемой инструкции location зависит от диапазона URI, обрабатываемых службой localhost:300/api/customers/. Если это один URI, синтаксис = будет работать. Если это какой-либо URI, который не соответствует /api/customers/:id/billing, то вам нужно будет использовать блок местоположения регулярного выражения. Подробности смотрите в этом документе.

Я не уверен, что это будет работать, если вы не прекратите SSL здесь. То есть настроить обратный прокси-сервер в качестве защищенного сервера.

Ответ 2

Принятый ответ не работал для меня; У меня было три сервера, работающих в качестве службы Kubernetes, сопоставленных с разными IP-адресами кластера (доступными только с узлов Kubernetes). Поэтому я использовал IP хост-компьютера - 10.ttt.ttt.104 и следующую конфигурацию, чтобы получить доступ к этим службам из моей рабочей сети.

Я не эксперт по nginx ни в одном length-, но это сработало - так что используйте его в качестве основы, может быть,

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