Длительные задержки NGINX при завершении загрузки через прокси через WebDAV

У меня есть внутренний сервер IIS, на котором работает WebDAV, который используется непосредственно для загрузки и выгрузки файлов из приложения Android.

Мой внутренний DNS разрешает https://webdav.mydomain.com непосредственно в IIS (минуя NGINX), и эта внутренняя связь, похоже, работает без проблем. Скорость загрузки и выгрузки не является фантастической для доступных скоростей беспроводной связи, но это то, к чему я привык в своей конфигурации IIS (из-за ограничений моего оборудования или просто ограничений IIS WebDAV).

Вне сети URL-адрес преобразуется в общедоступный IP-адрес моего сервера NGINX. При удаленном использовании приложения скорость загрузки также кажется приемлемой (~25 МБ/с).

Однако скорость загрузки низкая. Они составляют примерно половину скорости загрузки. Однако более важным, чем медлительность, является то, что в конце загрузки перед ее завершением возникает очень большая задержка.

Мой клиент показывает статус загрузки, в котором сообщается количество загружаемых байтов и общий размер загрузки. Когда загрузка достигает примерно 99% от общего размера загрузки, она просто остается там некоторое время, прежде чем окончательно завершиться.

В файле размером 50 МБ он остановится на отметке 49 МБ и подождет около 30 секунд перед завершением. Загрузка 3 ГБ ждала не менее 5 минут, прежде чем наконец завершилась успешно.

Эта проблема вообще не существует внутри системы, если сервер NGINX не задействован. Я согласен с тем, что у меня будет более медленная внешняя пропускная способность и даже с тем, что ограниченное оборудование NGINX может иметь дополнительное регулирование. Но я не уверен, почему NGINX может завершить загрузку на сервер IIS с такой большой задержкой.

Ниже приведена соответствующая конфигурация NGINX:

      upstream webdav_backend {
        server 10.10.10.102:443;
        keepalive 100;
}

server {
        listen 443 ssl http2;

        server_name webdav.mydomain.com;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Protocol $scheme;

        proxy_redirect off;
        proxy_buffering off;

        proxy_connect_timeout 180s;
        proxy_send_timeout 180s;
        proxy_read_timeout 180s;
        fastcgi_send_timeout 180s;
        fastcgi_read_timeout 180s;

        proxy_http_version 1.1;
        proxy_set_header Connection "";

        location @proxy {
                proxy_pass https://webdav_backend;
        }

        location / {
                try_files $uri @proxy;
                client_max_body_size 4G;
        }

        access_log /opt/var/log/nginx/webdav.mydomain.com.remote.log remote_hosts if=$remote_hosts;
        access_log /opt/var/log/nginx/webdav.mydomain.com.access.log;
        error_log /opt/var/log/nginx/webdav.mydomain.com.error.log;
}

1 ответ

Поэтому после публикации я вернулся, чтобы попытаться получить дополнительную информацию.

Я заметил, что во время загрузки мой сервер IIS не получал данные сразу после начала загрузки. Для файлов меньшего размера, таких как мой файл размером 50 МБ, казалось, что внутренний сервер не начинал получать данные до тех пор, пока они не были почти завершены, а для файлов большего размера я заметил большую буферизацию на клиенте, а также периоды бездействия при приеме сервером внутренних данных. данные.

Я также заметил, что память на моем сервере NGINX (встроенное оборудование с низкими характеристиками) уменьшалась примерно на 70 МБ (осталось 75% доступной памяти) во время передачи.

Все это убедило меня в том, что сервер NGINX по-прежнему каким-то образом кэширует/буферизирует данные, несмотря на то, что в конфигурации указано «proxy_buffering off». Я просмотрел документацию и обнаружил:

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_request_buffering

Отключение этой функции не только привело к полному устранению задержек, но, похоже, улучшило мою скорость загрузки в целом примерно на 50%.

Другие вопросы по тегам