NGINX 完成代理 WebDAV 上传时出现长时间延迟

NGINX 完成代理 WebDAV 上传时出现长时间延迟

我有一个运行 WebDAV 的内部 IIS 服务器,直接用于从 android 应用程序上传和下载文件。

我的内部 DNS 解析https://webdav.mydomain.com直接连接到 IIS(绕过 NGINX),这种内部通信似乎没有问题。对于可用的无线速度来说,上传和下载速度并不理想,但这是我在 IIS 配置中习惯的速度(无论是由于硬件限制还是 IIS WebDAV 限制)。

在网络外部,URL 解析为我的 NGINX 服务器的公共 IP。远程使用该应用程序时,下载速度似乎也可接受(~25 MB/s)。

但是上传速度很慢。上传速度大约是下载速度的一半。然而,比上传速度慢更重要的是,上传结束后需要很长时间才能完成。

我的客户端显示上传状态,报告正在上传的字节数和总上传大小。当上传达到总上传大小的 99% 左右时,它会停留一段时间,然后最终完成。

对于 50MB 的文件,它会在 49MB 左右停止并等待大约 30 秒才能完成。3GB 的上传至少要等待 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 服务器在上传开始时没有立即接收数据。对于较小的文件(比如我的 50MB 文件),后端服务器似乎直到上传接近完成时才开始接收数据;对于较大的文件,我注意到客户端上有更多的缓冲,并且后端服务器在接收数据时有一段时间不活动。

我还注意到,在传输过程中,我的 NGINX 服务器(低规格嵌入式硬件)的内存减少了约 70MB(剩余 75% 的可用内存)。

这一切都让我更加确信,尽管在配置中指定了“proxy_buffering off”,但 NGINX 服务器仍然以某种方式缓存/缓冲数据。我查看了文档并发现:

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

禁用此功能不仅可以完全消除延迟,而且似乎还提高了我的上传速度约 50%。

相关内容