Docker nginx无法将请求转发到运行在不同容器中的服务

Docker nginx无法将请求转发到运行在不同容器中的服务,docker,nginx,containers,microservices,Docker,Nginx,Containers,Microservices,我想在我的微服务架构中使用nginx反向代理作为APIGateway 问题:Nginx无法代理传递到在不同容器中运行的mypayment\u服务。但是,当我尝试从nginx容器内部curl payment\u service:3000时,它可以工作。所以网络还可以 docker compose.yml version: '3' services: payment_service: container_name: payment_service build: ./payment

我想在我的微服务架构中使用nginx反向代理作为APIGateway

问题:Nginx无法代理传递到在不同容器中运行的my
payment\u服务。但是,当我尝试从
nginx
容器内部
curl payment\u service:3000
时,它可以工作。所以网络还可以

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

根据

如果在没有URI的情况下指定了proxy_pass,则在处理原始请求时,请求URI将以与客户端发送的相同的形式传递到服务器,或者在处理更改的URI时传递完整的规范化请求URI

我不知道您的支付服务期望的是什么,但我假设您正试图找到根路径。您需要在代理过程中添加尾随斜杠

location /api/v1/payment {
    proxy_pass http://payment_server/;
}
否则,该请求将作为

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

如果在没有URI的情况下指定了proxy_pass,则在处理原始请求时,请求URI将以与客户端发送的相同的形式传递到服务器,或者在处理更改的URI时传递完整的规范化请求URI

我不知道您的支付服务期望的是什么,但我假设您正试图找到根路径。您需要在代理过程中添加尾随斜杠:

location /api/v1/payment {
    proxy_pass http://payment_server/;
}
否则,该请求将作为

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

非常感谢。是的,这就是问题所在。我试图代理的路径是根路径。非常感谢。是的,这就是问题所在。我试图代理的路径是根路径。