【问题标题】:nginx - connection timed out while reading upstreamnginx - 读取上游时连接超时
【发布时间】:2022-08-24 17:19:57
【问题描述】:

我有一个带有端点的烧瓶服务器,它处理一些上传的 .csv 文件并返回一个 .zip(在 JSON 响应中,作为 base64 字符串) 此过程最多可能需要 90 秒

我一直在使用 gunicorn 和 nginx 将其设置为生产环境,并且正在使用较小的 .csv 测试端点。它们得到了很好的处理,几秒钟后我得到了“got blob”日志。但是nginx没有返回给客户端,最后超时了。我设置了更长的失败超时 10 分钟,客户端将等待 10 分钟,然后超时

代理读取超时offered as solution here 设置为 3600s

根据this,代理连接超时也设置为75s

根据this,gunicorn 工人的超时时间也是如此

错误日志显示:\“upstream timed out connection timed out while reading upstream\” 我还看到 nginx 接收 OPTIONS 请求的示例,并且在 POST 请求之后(来自客户端的一些 CORS 怪异),其中 nginx 传递了 OPTIONS 请求但未能将 POST 请求传递给 gunicorn,尽管 nginx 已收到它

问题: 我在这里做错了什么? 非常感谢

http {
    upstream flask  { 
        server 127.0.0.1:5050 fail_timeout=600; 
    }
    # error log
    # 2022/08/18 14:49:11 [error] 1028#1028: *39 upstream timed out (110: Connection timed out) while reading upstream, ...
    # ...
    server {
        # ...
        location /api/ {
            proxy_pass http://flask/;
            proxy_read_timeout 3600;
            proxy_connect_timeout 75s;
            # ...
        }
    # ...
    }
}

# wsgi.py
from main import app
if __name__ == \'__main__\':
    app.run()

# flask endpoint
@app.route(\"/process-csv\", methods=[\'POST\'])
def process_csv():
    def wrapped_run_func():
        return blob, export_filename
    # ...
    try:
        blob, export_filename = wrapped_run_func()
        b64_file = base64.b64encode(blob.getvalue()).decode()
        ret = jsonify(file=b64_file, filename=export_filename)
        # return Response(response=ret, status=200, mimetype=\"application/json\")
        print(\"got blob\")
        return ret
    except Exception as e:
        app.logger.exception(f\"0: Error processing file: {export_filename}\")
        return  Response(\"Internal server error\", status=500)

附言。从 stackoverflow 得到这个错误 \"您的帖子似乎包含未正确格式化为代码的代码。请使用代码工具栏按钮或 CTRL+K 键盘快捷键将所有代码缩进 4 个空格。有关更多编辑帮助,请单击 [?] 工具栏图标。\ " 对于具有语言语法格式完美的代码,我很抱歉我不得不把它发布得很丑

    标签: nginx flask gunicorn


    【解决方案1】:

    可悲的是我没有得到回应

    请参阅最后几行以了解最终实施的“解决方案”

    错误原因:我认为问题在于我在 wsl1 上托管 Nginx 服务器

    我尝试更新到 wsl2 并查看是否修复了它,但我需要启用某种“嵌套虚拟化”,因为 wsl1 已经在 VM 上运行。

    通过 conf 更改,我得到了没有记录错误的地步,gunicorn 返回文件,然后它就停留在以太中。 Nginx 从不获取/发送响应

    “解决方案”: 我最终更改了客户端、服务器和 nginx.conf 文件的代码:

    服务器保存生成的文件,只返回文件名

    客户端将文件名插入到 href 中,然后显示链接

    单击时,请求被发送到 nginx,而 nginx 又只是从静态文件夹发送文件,只留下 gunicorn

    我想无论如何这是最好的方法,尽管它仍然困扰着我我无法(肯定)找到错误的原因

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 2017-04-01
      • 2014-03-01
      • 2011-08-01
      • 1970-01-01
      • 2018-01-31
      • 2012-12-19
      相关资源
      最近更新 更多