Как использовать nginx в качестве proxy_pass для распределения запросов по контейнерам приложений

Эй, я в настоящее время немного глуп, чтобы настроить nginx.

Моя цель — получить proxy_pass в соответствии с конфигурацией nginx для двух моих конечных точек REST:

  • http://localhost/app-one/ping -> http://app-one:1111/ping
  • http://localhost/app-two/ping -> http://app-two:2222/ping

означает, что если я позвоню http://localhost/app-one/ping из своего браузера, он должен быть перенаправлен на http://app-one:1111/ping в моей среде докеров

вот сильно упрощенное представление моих файлов docker и docker compose:

FROM nginx:alpine
COPY ./nginx.conf /etc/nginx/nginx.conf
version: '3.7'
services:
  proxy:
    image: "proxy"
    build: ./nginx-data
    ports:
    - "80:80"
    environment:
    - NGINX_PORT=80
  app-one:
    image: "app-one"
    container_name: app-one
  app-two:
    image: "app-two"
    container_name: app-two

и вот моя попытка конфигурации nginx, которая не удалась:

worker_processes 1;
  
events { worker_connections 1024; }

http {

    sendfile on;

    upstream app-one {
        server app-one:1111;
    }

    upstream app-two {
        server app-two:2222;
    }

    proxy_set_header   Host $host;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Host $server_name;
    
    server {
        listen 80;
 
        location /app-one {
            proxy_pass         http://app-one:1111;
            proxy_redirect     off;
        }
    }

    server {
        listen 80;
 
        location /app-two {
            proxy_pass         http://app-two:2222;
            proxy_redirect     off;
        }
    }
}

Кто-нибудь знает, как настроить конфигурацию nginx :) В любом случае, есть ли какие-либо другие проблемы, описанные выше, заранее спасибо за вашу помощь.

есть ли 3 контейнера в одной и той же среде выполнения докеров? если да: 1) должен быть выставлен только обратный прокси; 2) приложение-один и приложение-два могут прослушивать один и тот же порт (это необязательно, но может помочь вам понять, что происходит на самом деле). 3) контейнер nginx может обращаться к двум серверным приложениям, используя их служебные имена, не выходя из сети докеров; 4) в заключение, обычный proxy_pass должен работать: location /app-one { proxy_pass: app-one:1111 }

Neo Anderson 02.04.2023 01:28

это сработало, спасибо :) проблема, похоже, была в том, что прокси запустился раньше приложения. когда я запускаю его потом, все работает, как вы описали

TheBohne 02.04.2023 12:44
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
2
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Контейнеры приложений уже должны быть запущены, когда будет запущен прокси-сервер nginx. В противном случае конфигурация nginx не работает, поэтому он не запускается.

Чтобы решить эту проблему, мы можем изменить файл docker-compose с помощью раздела depend_on, чтобы он работал должным образом:

version: '3.7'
services:
  proxy:
    image: "proxy"
    build: ./nginx-data
    ports:
    - "80:80"
    environment:
    - NGINX_PORT=80
    depends_on:
      app-one:
        condition: service_started
      app-two:
        condition: service_started
  app-one:
    image: "app-one"
    container_name: app-one
  app-two:
    image: "app-two"
    container_name: app-two

Процесс выполнения:

Команда docker-compose up запускает службы в порядке зависимости. В нашем примере приложение-1 и приложение-2 запускаются до запуска прокси-сервиса.

Команда docker-compose stop останавливает службы в порядке зависимости. В нашем примере прокси останавливается перед приложением-1 и приложением-2.

Другие вопросы по теме