我正在尝试在 Fedora 38 Plasma KDE 上设置 Nginx-Docker(几乎全新安装)。 Nginx 可以很好地连接到在端口 3000 上本地运行的反应服务器(非 docker)。但是,Nginx 无法连接到本地运行的后端服务器(scala、http4s、非 docker)。我还有 2 个 postgres 实例在 docker 的端口 5433 和 5432 上运行,后端连接到这些端口。
docker exec -it nginx-proxy curl host.docker.internal:4001/graphiql.html
curl: (7) Failed to connect to host.docker.internal port 4001 after 0 ms: Couldn't connect to server
curl localhost:4001/graphiql.html
# successful response
docker exec -it nginx-proxy curl host.docker.internal:3000
# successful response
curl localhost:3000
# successful response
使用netstat时,我注意到后端服务器正在使用tcp6,而react-server则没有。 (Postgres 在 tcp 和 tcp6 上)。之所以tcp6
脱颖而出,是因为我也遇到了 git 和 npm 的问题,这些问题通过强制它们使用ipv4
.
我不知道我当前的问题是否tcp6
相关,所以这可能是一个转移注意力的问题。如果它与 tcp6 相关,那么它似乎不是硬件,因为一切都在我的笔记本电脑上运行,这似乎是合乎逻辑的。
$ netstat -anp | grep -E ':3000|:4001|:5433|:5432'
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 61886/node-18
tcp 0 0 0.0.0.0:5433 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN -
tcp6 0 0 127.0.0.1:4001 :::* LISTEN 59873/java
tcp6 0 0 :::5433 :::* LISTEN -
tcp6 0 0 :::5432 :::* LISTEN -
我也许可以尝试弄清楚如何强制我的后端服务器在 IPV4 上运行,甚至将其 Docker 化,但如果可行,那可能只会延迟接下来的十几个随机意外 IPV6 问题。
Nginx docker-compose.yml
version: '3.7'
services:
nginx:
image: nginx:alpine
container_name: nginx-proxy
restart: always
volumes:
- ./html:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./nginx.conf:/etc/nginx/nginx.conf
ports:
- '80:80'
extra_hosts:
- "host.docker.internal:host-gateway"
nginx.conf
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location /graphql {
proxy_pass http://host.docker.internal:4001/graphql;
}
location /graphiql.html {
proxy_pass http://host.docker.internal:4001/graphiql.html;
}
location / {
proxy_pass http://host.docker.internal:3000;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}