0

在尝试了一天网络上的各种提示之后,我对此一无所知:我有一个最简单的 Flask 应用程序,提供一个静态 600MB 文件供下载。大约 1,5-2 分钟或大约 80-280MB(所以在相同数量的字节或秒之后根本不会)下载停止并且客户端获得 HTTP 500(根据 IIS 日志)。

  • 如果我在该 IIS 上从静态网站(根本不涉及 python 或烧瓶)提供相同的文件,则下载完成。
  • 如果我在与本地服务器相同的机器上启动烧瓶(当然,通过 localhost 访问它),一切运行良好。
  • 如果我在运行 Windows Server 2012R2 和 IIS 8.5 的第二台服务器上提供相同的应用程序,它可以正常工作。
  • wfastcgi 日志没有显示任何错误,flask 也没有抛出任何异常。

代码相当简单:

__init_.py

def create_app():
    filename = inspect.getframeinfo(inspect.currentframe()).filename
    root_path = os.path.dirname(os.path.abspath(filename))
    app = Flask(__name__, root_path=root_path)
    return app

app = create_app()

@app.route("/")
def index():
    return render_template('index.html')

模板下的index.html :

<html>
  <body>
    <a href="{{url_for("static", filename="bigfile.bin")}}"> Please download </a>
  </body>
</html>

如果还尝试显式使用烧瓶的 send_from_directory -> 相同的区别。

我已将我知道的所有超时设置为至少 5 分钟:ApplicationPool 的超时、站点的连接超时,甚至 system.applicationHost/webLimits 下的连接超时。我也将 minBytesPerSecond 更改为 0。

Web 服务器是安装了 wfastcgi 的 Windows Server 2019 上的 IIS 10。该问题发生在 HTTPS 和 HTTP 上。对于 https:打开或关闭 HTTP/2 没有效果。我在客户端站点上使用了当前的 Firefox、Chrome 和 iOS Safari,没有区别。

版本是:Python 3.6.4(我也尝试过 3.7.x)Flask 1.1.1 Werkzeug 1.0.1 wfastcgi 3.0.0。这些版本与它工作的旧 IIS 8.5 上的版本完全相同。

更改操作系统在这里不是一个选项,更改网络服务器至少会是一个巨大的痛苦。

任何关于如何调试下载失败的位置和原因的建议(我什至不确定此时是否仍涉及烧瓶)将不胜感激。IIS 日志和 wfastcgi 日志都不再给我任何想法。

4

1 回答 1

0

C.Nivs 为我指明了正确的方向。谢谢一堆。

如果其他人遇到类似的问题,我是这样解决的:我必须先在 IIS 中安装失败的请求跟踪。这里有一个关于如何使用它的很好的描述:https ://docs.microsoft.com/en-us/iis/troubleshoot/using-failed-request-tracing/troubleshooting-failed-requests-using-tracing-in- iis-85

它显示请求因 FASTCGI_REQUEST_TIMEOUT 而失败。所以在 IIS 中还有另一个超时需要处理:它在 IIS\Fast CGI 设置下,在 python.exe->Edit 下。设置 RequestTimeout 解决了我的问题。

于 2020-04-03T04:29:57.840 回答