Flask + Nginx反向代理拒绝在Docker容器中连接

时间:2020-01-15 20:23:59

标签: docker nginx flask docker-compose

我有一个使用Flask作为后端的React应用。我正在尝试将React应用程序从Nginx服务器提供服务。 Nginx和Flask服务器都在docker容器中。静态内容可以正常工作,但是当站点尝试将呼叫代理到Flask服务器时,连接将被拒绝。

我在Flask服务器上看不到任何日志,因此我认为请求没有进入Flask容器。我尝试过更改代理以打不同的端口并遇到相同的问题。不应该允许容器彼此通信,还是必须显式允许某些端口打开?它们之间是否需要WSGI服务器?

Nginx default.conf

server {

   listen        80;
   server_name   localhost;

   location / {
      index      index.html;
      root       /usr/share/nginx/html;
   }

   location /api/ {
      proxy_pass http://flask:5000;
      proxy_http_version 1.1;
      proxy_set_header Connection "";
      proxy_set_header Host "localhost";
   }

}

docker-compose.yml

version: "3"
services:
    nginx:
        image: nginx
        volumes:
            - /home/cookery/Cookery/dining/build:/usr/share/nginx/html
            - /home/cookery/Cookery/docker/docker.conf:/etc/nginx/conf.d/default.conf
        ports:
            - "8080:80"
    flask:
        build: ../kitchen
        ports:
            - "5000:5000"

这是我在请求烧瓶服务器时遇到的错误

2020/01/15 21:18:08 [error] 6#6: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.26.0.1, server: localhost, request: "GET /api/recipes/all HTTP/1.1", upstream: "http://172.26.0.2:5000/api/recipes/all", host: "localhost:8080", referrer: "http://localhost:8080/"

1 个答案:

答案 0 :(得分:3)

Flask之类的声音正在监听127.0.0.1,这意味着“本地计算机”。每个容器都有自己的127.0.0.1,因此nginx正在连接到其容器127.0.0.1,这与Flask正在监听的容器不同。

解决方案是让Flask监听0.0.0.0。

有关更多详细信息,请参见https://pythonspeed.com/articles/docker-connection-refused/