загрузка файла большего размера c прекращается с использованием Flask на IIS10 и Windows Server 2019 - PullRequest
0 голосов
/ 02 апреля 2020

После дня, когда я попробовал всевозможные подсказки из Интернета, у меня не осталось идей с этим: у меня самое простое Flask приложение, обслуживающее файл stati c 600MB для загрузки. Примерно через 1,5–2 минуты или около 80–280 МБ (поэтому совсем не после того же количества байтов или секунд) загрузка останавливается, и клиент получает HTTP 500 (согласно журналу IIS).

  • Если я предоставлю тот же файл с веб-сайта stati c (без python или flask при всех задействованных) на этом IIS, загрузка завершится.
  • Все работает нормально, если я запускаю flask на той же машине, что и локальный сервер (и, конечно, получаю к нему доступ через 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>

Если вы также пытались явно использовать flask send_from_directory -> та же разница.

Я установил все известные мне тайм-ауты, по крайней мере, до 5 минут: тайм-ауты для ApplicationPool, тайм-аут соединения с сайтом и даже тайм-аут соединения в system.applicationHost / webLimits. Там я также изменил minBytesPerSecond на 0.

Веб-сервер - это IIS 10 на Windows Сервер 2019 с установленным wfastcgi. Проблема возникает по 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, где он работает.

Смена ОС здесь не вариант, изменение веб-сервера будет по крайней мере огромной болью.

Любые предложения даже относительно того, как отлаживать, где и почему именно загрузка не удалась (я даже не уверен, если flask все еще участвует в этом пункте) будет высоко оценен. Ни журналы IIS, ни журнал wfastcgi больше не дают мне представления.

1 Ответ

0 голосов
/ 03 апреля 2020

C. Нивс указал мне в правильном направлении. Огромное спасибо.

Если другие столкнулись с подобными проблемами, вот как я их решил: сначала мне пришлось установить отслеживание сбоев в 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 Settings и там в python .exe-> Edit. Установка RequestTimeout решило мою проблему.

...