Search code examples
dockernginxcontainersmicroservices

nginx unable to forward request to a service running in a different container


I want to use nginx reverse proxy as an APIGateway in my microservice architecture

Problem: Nginx is unable to proxy_pass to my payment_service running in a different container. However, when I try to curl payment_service:3000 from inside nginx container, it works. So the network is ok.

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

Payment service is working fine when I directly access it using http://localhost:3000 But dont work with http://localhost:8080/api/v1/payment


Solution

  • According to the docs

    If proxy_pass is specified without a URI, the request URI is passed to the server in the same form as sent by a client when the original request is processed, or the full normalized request URI is passed when processing the changed URI...

    I don't know what your payment service is expecting, but I'm assuming you're trying to hit the root path. You need to add a trailing slash to the proxy_pass:

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

    otherwise the request will be made as

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