Nginx 找不到正在运行的后端服务

Nginx 找不到正在运行的后端服务

我正在为具有 Web 前端和 Flask 后端的应用程序设置一个 nginx Web 服务器,每个都在 docker 容器中运行。以下是我的 nginx 配置:

events{}
http{
client_max_body_size 50M;
   server {
    listen 80;

    location /api {
        proxy_pass http://0.0.0.0:5000;
    }

    location / {
        root /var/www/;
        try_files $uri /index.html;
    }
  }
}

我可以正常访问我的前端localhost。但是,我的后端无法访问。

例如,我可以使用正确的端口直接访问后端:localhost:5000/api/alive给了我预期的响应,但是localhost/api/alive给了我

502 Bad Gateway
nginx/1.23.4

并出现以下错误

172.27.0.1 - - [07/Apr/2023:21:22:12 +0000] "GET /api/alive HTTP/1.1" 502 559 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"

2023/04/07 21:22:12 [error] 108#108: *35 connect() failed (111: Connection refused) while connecting to upstream, client: 172.27.0.1, server: , request: "GET /api/alive HTTP/1.1", upstream: "http://0.0.0.0:5000/api/alive", host: "0.0.0.0"

如何才能正确路由我的请求?我是 nginx 新手,不明白错误消息。

答案1

0.0.0.0不是有效的 IP 地址。这是绑定到所有地址的符号,用于配置应侦听的服务。

将您的配置更改为环回接口的 IP 地址。

location /api {
    proxy_pass http://127.0.0.1:5000;
}

关于docker容器:你无法通过以下方式访问另一个容器上的端口localhost。每个容器都有自己的网络命名空间,由主机分隔。要从一个容器访问另一个容器,您有三种可能:

  • 主机网络
  • 容器链接(遗留,将来可能会被删除)
  • 定制网络

由于自定义网络是最可行的选择,所以我将重点关注这一点。

您需要创建一个网络,并在创建容器时引用它。

docker network create my-network
docker run --network my-network --name db mariadb:latest
docker run --network my-network --name app -p 80:8080 myimage

db现在您可以从内部通过其名称引用容器app。您不需要在 db 容器中发布端口,因为它们共享同一个网络。

使用 docker-compose 时,您不需要做任何特殊的事情,当涉及的所有容器都在同一个 yaml 文件中定义时,它会默认为容器创建一个网络。

如果您有多个 yaml 文件并想要共享一个容器,例如单个数据库实例,您可以在docker-compose.yml.

相关内容