nginx не может переслать запрос службе, работающей в другом контейнере - PullRequest
1 голос
/ 27 сентября 2019

Я хочу использовать обратный прокси-сервер nginx в качестве APIGateway в моей архитектуре микросервиса

Проблема: Nginx не может выполнить proxy_pass для моего payment_service, работающего в другом контейнере.Однако, когда я пытаюсь curl payment_service:3000 изнутри nginx контейнер, это работает.Таким образом, сеть в порядке.

docker-compose.yml

version: '3'

services:

 payment_service:
   container_name: payment_service
   build: ./payment
   ports:
    - "3000:3000"
   volumes:
     - ./payment:/usr/app
   networks:
     - microservice-network

 api_gateway:
   image: nginx:latest
   container_name: api_gateway
   restart: always
   volumes:
     - ./default.conf:/etc/nginx/conf.d/default.conf
   ports:
     - 8080:8080
     - 443:443
   depends_on:
     - payment_service
   networks:
     - microservice-network

networks:
  microservice-network:
  driver: bridge

default.conf

upstream payment_server {
  server payment_service:3000 max_fails=10;
}

server {
  listen 8080;

  location /api/v1/payment {
    proxy_pass http://payment_server;
  }
}

Платежный сервис работает нормально, когда я напрямую обращаюсь к нему, используя http://localhost:3000, но не работаю с http://localhost:8080/api/v1/payment

1 Ответ

0 голосов
/ 27 сентября 2019

В соответствии с документами

Если proxy_pass указан без URI, URI запроса передается на сервер в той же форме, что и отправленный клиентом, когда оригиналзапрос обрабатывается или полный нормализованный URI запроса передается при обработке измененного URI ...

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

location /api/v1/payment {
    proxy_pass http://payment_server/;
}

, в противном случае запрос будет выполнен как

http://payment_service:3000/api/v1/payment
...