带有 Gunicorn 的 Flask App 在生产中给出错误:套接字挂断

Posted

技术标签:

【中文标题】带有 Gunicorn 的 Flask App 在生产中给出错误:套接字挂断【英文标题】:Flask App with Gunicorn in production giving Error: socket hang up 【发布时间】:2021-01-22 01:26:55 【问题描述】:

我有一个 Flask 应用程序在 Paperspace 服务器上使用 Gunicorn 作为 Docker 容器运行 -

Dockerfile

FROM ubuntu:18.04
FROM python:3
RUN apt-get update -y && apt-get install -y python-pip python-dev
COPY . /backend
WORKDIR /backend
RUN pip3 install -r requirements.txt
EXPOSE 8000
CMD gunicorn --timeout 10000 --workers 4 --log-level debug --bind 0.0.0.0:8000 wsgi:app

app.py

#!/usr/bin/env python
# -*- coding: utf-8 -*- 
from flask import Flask, request

UPLOAD_FOLDER = '/uploads'
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
           
@app.route('/upload_file', methods=['GET', 'POST'])
def upload_file():
    return "it works fine"

wsgi.py

from api import app

if __name__ == '__main__':
    app.run()

我使用它运行它

sudo docker run -it -p 8000:8000 myFlaskApp:1.28

在从 Postman 触发 API (/upload_file) 时,我得到了

Error: socket hang up

但是,这个 API 在 localhost (http://0.0.0.0:8000) 上运行良好

【问题讨论】:

我无法使用上面的代码 sn-ps 重新创建您的问题。有一些事情首先阻止了 docker 容器的构建(api 文件夹不存在,所以我从 api 中删除;wsgi 文件是多余的,所以我删除了它并将 if 主检查放在底部app.py; 更改了 docker CMD 以从 app:app 加载应用程序)。当我解决这些问题时,应用程序按预期运行。我怀疑这是对更大项目的简化,实际问题没有在上面的代码中表示。 【参考方案1】:

尝试先在终端中自己运行 gunicorn 服务器(不使用 docker)

gunicorn -w xx -t xx -b 0.0.0.0:8080 wsgi:app

如果 gunicorn 运行良好,则 dockerfile 有问题。我认为您应该将 ENTRYPOINT 设为 gunicorn,然后在 CMD 中指定参数。

ENTRYPOINT ["gunicorn"]
CMD ["-w", "4", "-t", "10000", "-b", "0.0.0.0:8080", "wsgi:app"]

【讨论】:

以上是关于带有 Gunicorn 的 Flask App 在生产中给出错误:套接字挂断的主要内容,如果未能解决你的问题,请参考以下文章

gunicorn部署flask--出现错误解决方案

Flask“(”使用gunicorn时出现意外错误

flask启动 gunicorn启动flask

flask启动 gunicorn启动flask

flask中gunicorn的使用

python flask项目部署上线之Gunicorn和Nginx的准备