我有一个运行 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%。