我有一个带有和端点的烧瓶服务器,它处理一些上传的.csv文件并返回一个.zip (在JSON中,作为base64字符串),这个过程可能需要长达90秒
我一直在使用gunicorn和nginx为生产做准备,我正在用更小的.csv测试端点,它们处理得很好,几秒钟后我就得到了“get”日志。但是nginx不会将其返回给客户端,最后会超时。我设置了一个更长的故障超时时间为10分钟,客户端将等待10分钟,然后超时。
代理读取超时offered as solution here设置为3600 s。
此外,根据this,代理连接超时设置为75s。
根据this的说法,枪手的超时也是如此。
错误日志上写着:“上游超时连接超时,同时读取上游”,我还看到nginx接收选项请求的例子,以及在POST请求之后(一些CORS奇怪地来自客户端)的例子,其中nginx传递选项请求,但在nginx收到后没有将POST请求传递给gunicorn。
问:我在这里做错了什么?非常感谢
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)ps。“从堆栈溢出中获取此错误”您的文章似乎包含未正确格式化为代码的代码。请使用“代码”工具栏按钮或CTRL+K键盘快捷方式按4个空格缩进所有代码。要获得更多编辑帮助,请单击工具栏图标。由于有非常好的格式化代码与语言语法,我很抱歉,我不得不张贴它丑陋
发布于 2022-08-24 09:19:57
遗憾的是我没有得到回应
请参见最后一行的“解决方案”最终实现。
错误原因:我认为问题在于我在wsl1上托管了Nginx服务器
我尝试更新到wsl2,看看是否修复了它,但我需要启用某种“嵌套虚拟化”,因为wsl1已经在VM上运行。
通过更改conf,我得到了一个没有错误记录的点,gunicorn返回了文件,然后它就留在了乙醚中。Nginx从不得到/发送响应。
“解决方案”:我最终更改了客户机、服务器和nginx.conf文件的代码:
服务器保存结果文件,并只返回文件名。
客户端将文件名插入到href中,然后显示一个链接。
单击时,将请求发送到nginx,而nginx只从一个静态文件夹发送文件,而只剩下gunicorn一个人。
我想这是做这件事的最佳方法,尽管它仍然困扰着我,我(当然)找不到错误的原因。
https://stackoverflow.com/questions/73406437
复制相似问题