gpt4 book ai didi

node.js - 从服务器端调用 API 需要服务名称作为 API 主机,但在客户端上无法访问

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:48 25 4
gpt4 key购买 nike

我正在使用 docker-compose 设置 Laravel API 和 Nuxt 前端。我有两个单独的项目(和两个 docker-compose.yml),我通过网络连接它们。问题是,当我在 Nuxt 的服务器端调用 API 时,API 主机名是 Laravel 的服务,但在客户端该服务无法访问。

API 从容器中的端口 80 映射到我的主机上的 8080。在客户端,我可以通过调用http://localhost:8080/api/来访问API但我也在 Nuxt 服务器端进行了一些调用,它无法从容器访问主机,因此它必须调用 http://app-dev/api 上的 API

#backend.yml
version: '3.5'
services:
database:
image: mariadb:10.3
networks:
- my-network
#...

app-dev:
depends_on:
- "database"
ports:
- 8080:80
networks:
- my-network
#...

networks:
my-network:
name: my-network
#------------------------
#frontend.yml
version: '3.5'
services:
front-app-dev:
ports:
- ${FRONTEND_SERVER_PORT}:${FRONTEND_SERVER_PORT}
networks:
- my-network
#...

networks:
my-network:
external: true

如何统一服务器端和客户端的API调用?我可以轻松配置 Node 服务器来代理从客户端到应用程序开发的调用(例如代理调用 http://localhost :{FRONTEND_SERVER_PORT}/api 到 http://app-dev/api )?或者是否有某种方法可以使主机的端口 8080 在 front-app-dev 中可访问,以便服务器端可以在那里进行调用?

最佳答案

我设法用 traefik 做到了这一点。我添加了服务:

traefik:
image: traefik:alpine
ports:
- 8000:80
volumes:
- ./docker/traefik:/etc/traefik
- /var/run/docker.sock:/var/run/docker.sock
networks:
- my-network
restart: always

我的./docker/traefik.toml:

defaultEntryPoints = ["http"]

[entryPoints]
[entryPoints.http]
address = ":80"

[docker]
watch = true
endpoint = "unix:///var/run/docker.sock"
exposedByDefault = false
debug = true

我更改了 app-dev 容器,因此 apache 在端口 8000 上提供 API。在 compose 中,我向 app-dev 添加了以下几行:

labels:
- "traefik.enable=true"
- "traefik.docker.network=my-network"
- "traefik.port=8000"
- "traefik.frontend.rule=Host:app-dev"

我还在/etc/hosts中添加了app-dev,它指向127.0.0.1。因此,当我在浏览器中输入 app-dev:8000 时(或者当客户端调用它时),traefik 会将我重定向到 app-dev 容器中的端口 8000。当我在服务器上调用 API 时,它还会调用 app-dev:8000 并像以前一样直接指向容器。所以客户端和服务器都使用相同的地址。

关于node.js - 从服务器端调用 API 需要服务名称作为 API 主机,但在客户端上无法访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56475458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com