首页 > 解决方案 > 从上游客户端 172.17.0.1 读取响应标头时上游超时

问题描述

upstream timeout while reading response header from upstream client 172.17.0.1... 

运行 docker 映像时出现此错误,不确定为什么会出现此错误。我尝试在另一台计算机上运行相同的图像,它工作正常。

我用来运行这个程序的 docker 命令:

docker run -e "PORT=8765" -p 8007:8765 akash9179/flask-vue  

完整的错误:

10#10: *2 upstream timed out (110: operation timed out) while reading response header from upstream, client:172.17.0.1, server: request: "GET /users HTTP/1.1", upstream: "http://127.0.0.1:5000/users", host: "localhost:8007", referrer: "http://localhost:8007/".

Dockerfile 以以下结尾:

CMD gunicorn -b 0.0.0.0:5000 app:app --daemon && \
      sed -i -e 's/$PORT/'"$PORT"'/g' /etc/nginx/conf.d/default.conf && \
      nginx -g 'daemon off;'

标签: pythondockerflask

解决方案


这很可能是由于您在 Dockerfile 中调用服务器的方式:

CMD gunicorn -b 0.0.0.0:5000 app:app --daemon && \
      sed -i -e 's/$PORT/'"$PORT"'/g' /etc/nginx/conf.d/default.conf && \
      nginx -g 'daemon off;'

我怀疑这一CMD行,nginx 在进程成功完成之前实际上并没有运行gunicorn,因为它正在运行服务器,所以它不会运行。

正确的架构方法是为 gunicorn 服务器和 nginx 服务器创建一个单独的 Dockerfile。您试图将太多内容打包到单个 Dockerfile 中。每个容器应该运行一个进程!

然后,您应该在文件中将这些定义为单独的服务docker-compose.yml

services:
  flask:
    build:
      context: .
      dockerfile: Dockerfile-flask
  nginx:
    build:
      context: .
      dockerfile: Dockerfile-nginx

在每个容器中,服务名称(即flasknginx)可用于代替主机名访问另一个容器。因此,在 nginx 配置中,proxy_pass您可以在其中执行以下操作:

  location /ping {
    proxy_pass      http://flask:5000;
  }

sed此外,覆盖default.conf更改 nginx 端口号的那一行可能没有意义。我会在配置中坚持使用静态 nginx 端口,然后当您执行运行命令时,只需将其记录下来,用户就知道他们需要将自己首选的外部端口映射到您的 nginx 服务器的端口。

这也将避免需要将 PORT 作为环境变量传递。


推荐阅读