给出以下架构:
client <-> AWS NLB <-> AWS ALB <-> static file server
在慢速网络上使用 HTTP/2 时,客户端无法下载 12MB 文件,但在使用 HTTP/1.1 或带宽足够高时可以正常下载。无论文件是动态提供的(通过 Django)、作为来自 uwsgi 的静态文件还是作为来自 Nginx 的静态文件,都没有什么区别。
这是一个失败的示例(我使用 Socks 代理来限制带宽):
$ curl -x socks5://localhost:1080 https://example.com/file.pdf --output "file.pdf"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
79 12.6M 79 10.0M 0 0 61254 0 0:03:36 0:02:51 0:00:45 64422
curl: (92) HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)
但是,带有标志
--http1.1
的相同命令可以正常工作。
当我将下载限制为 512kbps 时,此操作会失败 - 它可以在 1024Kbps 下运行。我没有寻找最佳点,这并不重要。
备注:
curl
问题curl
与 -v
一起使用不会提供任何附加信息。[pid: 44|app: 0|req: 2603/9176] [ip] () {34 vars in 639 bytes} [Wed Oct 16 09:29:29 2024] GET /file.pdf => generated 13243923 bytes in 2425 msecs (HTTP/1.1 200) 8 headers in 314 bytes (103471 switches on core 0)
我想了解为什么 HTTP/2 和慢速网络会失败。我怀疑这与 ALB 有关。
所以我发现了三件事可以解决这个问题:
最后一点(这是我要寻求的解决方案)我只尝试作为最后的手段 - 因为相同的下载在 HTTP/1.1 上成功(相同的字节数,相同的网络条件)我没有预计超时或缓冲会成为问题。
然而,ALB 在 HTTP/2 中处理超时的方式似乎比在 HTTP/1.1 中更积极
如果我不得不冒险猜测:
我正在回答我自己的问题,但不会将其标记为已接受的答案,因为它们只是猜测。如果有人有一些明确的答案,我仍然想听听他们。
[*] 互联网并不清楚 ALB 是否会缓冲 - 有些人说它会缓冲,但由于它是近源且未在文档中指定,因此我们没有明确的答案