在 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 日志)。
- 如果我在该 IIS 上从静态网站(根本不涉及 python 或 flask)提供相同的文件,则下载完成。
- 如果我在与本地服务器相同的机器上启动 flask(当然是通过 localhost 访问它),一切运行良好。
- 如果我在第二台服务器 运行 Windows 服务器 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>
如果也尝试使用 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 解决了我的问题。
在尝试了一天来自网络的各种提示后,我对这个没有想法:我有最简单的 Flask 应用程序,提供 600MB 的静态文件供下载。大约 1,5-2 分钟或大约 80-280MB 后(因此在相同数量的字节或秒后根本不会)下载停止并且客户端收到 HTTP 500(根据 IIS 日志)。
- 如果我在该 IIS 上从静态网站(根本不涉及 python 或 flask)提供相同的文件,则下载完成。
- 如果我在与本地服务器相同的机器上启动 flask(当然是通过 localhost 访问它),一切运行良好。
- 如果我在第二台服务器 运行 Windows 服务器 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>
如果也尝试使用 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 解决了我的问题。