在 IIS10 和 Windows Server 2019 上使用 Flask 停止下载较大的静态文件

download of larger static file stops using Flask on IIS10 and Windows Server 2019

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

代码相当简单:

__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>

如果也尝试使用 flask 的 send_from_directory 显式 -> 相同的区别。

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

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

版本是: Python3.6.4(我也试过3.7.x) 烧瓶 1.1.1 Werkzeug 1.0.1 wfastcgi 3.0.0。 这些版本与旧版 IIS 8.5 上的版本完全相同。

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

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

C.Nivs 给我指出了正确的方向。非常感谢。

如果其他人 运行 遇到类似的问题,我是这样解决的:我必须先在 IIS 中安装 Failed Request Tracing。这里有关于如何使用它的很好的描述: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 解决了我的问题。