【发布时间】: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 个空格。有关更多编辑帮助,请单击 [?] 工具栏图标。\ " 对于具有语言语法格式完美的代码,我很抱歉我不得不把它发布得很丑