我目前正在一个容器中运行一个 SvelteKit 应用程序,该容器连接到另一个容器中运行的 API。一切都使用容器的internal
URL 在本地连接和处理。如果我使用 URL 将本地应用程序容器指向暂存服务器 API 容器,它也可以正常工作external
。当容器在使用不同暂存子域 URL 的同一个暂存服务器(相同 IP)上运行时,就会出现问题。这两个容器都可以从外部访问,因为我可以单独连接到它们。但是,应用程序容器内对 API 容器的获取请求似乎存在问题,无法连接到 API 并出现错误UND_ERR_CONNECT_TIMEOUT
。如果我使用internal
应用程序容器内的 URL 指向 API 容器,它就会连接。
# Local Machine
# Local -> Internal | works
SvelteKit container API container
localhost:5173 -> http://api:4000/api
# Local -> External | works
SvelteKit container API container
localhost:5173 -> https://example.com/api
# Local & 3rd-party Server
$ wget --spider https://example.com/api
Spider mode enabled. Check if remote file exists.
--2023-09-30 13:22:40-- https://example.com/api
Resolving example.com (example.com)... x.x.x.x
Connecting to example.com (example.com)|x.x.x.x|:443... connected.
# Remote Server
# Remote -> Internal | works
SvelteKit container API container
https://app.example.com -> http://api:4000/api
# Remote -> External | fails UND_ERR_CONNECT_TIMEOUT
SvelteKit container API container
https://app.example.com -> https://example.com/api
# Host & WithinContainer
$ wget --spider https://google.com
Spider mode enabled. Check if remote file exists.
--2023-09-30 13:29:12-- https://google.com/
Resolving google.com (google.com)... 172.217.13.174, 2607:f8b0:4020:806::200e
Connecting to google.com (google.com)|172.217.13.174|:443... connected.
$ wget --spider https://example.com/api
Spider mode enabled. Check if remote file exists.
--2023-09-30 13:22:40-- https://example.com/api
Resolving example.com (example.com)... x.x.x.x
Connecting to example.com (example.com)|x.x.x.x|:443... failed: Connection timed out.
我不确定为什么我可以从外部连接到远程服务器,也可以从远程服务器连接到另一台服务器,但不能从远程服务器连接到自身。这是服务器本身的问题、iptables 防火墙的问题、路由器的问题还是这些问题的组合?
看来远程服务器无法连接自身。