python - 从上游客户端 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;'
解决方案
这很可能是由于您在 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
在每个容器中,服务名称(即flask
和nginx
)可用于代替主机名访问另一个容器。因此,在 nginx 配置中,proxy_pass
您可以在其中执行以下操作:
location /ping {
proxy_pass http://flask:5000;
}
sed
此外,覆盖default.conf
更改 nginx 端口号的那一行可能没有意义。我会在配置中坚持使用静态 nginx 端口,然后当您执行运行命令时,只需将其记录下来,用户就知道他们需要将自己首选的外部端口映射到您的 nginx 服务器的端口。
这也将避免需要将 PORT 作为环境变量传递。
推荐阅读
- python - 当包装器具有实例变量时键入类装饰器
- css - 通过 CSS 将自定义字体添加到 Wordpress 主题
- postgresql - 如何通过终端在 psql 中保存查询
- firebase - 错误 TS2740:类型“DocumentChangeAction<{}>[]”缺少类型中的以下属性
- php - 带有存储目录的 LARAVEL 队列
- android - 如何修改芯片的样式?
- python - 如何在 Python 中创建两级嵌套 JSON?
- django - Django 与 Vue 教程
- javascript - 在 Java Canvas 中优化图像旋转
- .net - System.Net.Http 包冲突