我们有一个设置,其中前端 HTTP2 服务器是 HAProxy,多个后端服务器运行 Apache+PHP。我们已经设置了 HAProxy 配置option http-buffer-request
。最终用户上传文件(使用<form>
with 方法的基本文件上传POST
)并且小文件得到正确处理。但是,当最终用户上传例如 50 MB 的文件时,似乎 HAProxy 在连接后端服务器之前没有缓冲上传的文件。
后端服务器的超时时间非常短,因为预期用例是使用本地网络中的 1 Gbps 连接将文件从 HAProxy 传输到后端服务器。HAProxy->后端连接目前限制为 35 秒(timeout server 35s
)。但是,当最终用户上传量很大且其上传带宽较低时,除非上传在timeout server
限制内完成,否则上传将失败。对于 Google Chrome,浏览器会自动重试并再次提交文件。第三次,最后显示错误ERR_HTTP2_SERVER_REFUSED_STREAM
。
如果我理解正确的话,HAProxy 缓冲反向代理缓冲配置有选项tune.buffers.limit
默认为零无限。是否存在其他限制,可以防止大上传在 HAProxy 级别缓冲?HAProxy 服务器仅运行 HAProxy 并执行 TLS 终止,并为此配备了 16 GB 的 RAM,因此如果不支持将上传缓冲到磁盘,我可以在 RAM 中进行缓冲。不过,将缓冲限制为最高 14 GB 可能会更好。
我们希望允许上传最大 250 MB,最好在 HAProxy 连接到 Apache 处理上传之前,整个上传都应由 HAProxy 缓冲。实际上,HAProxy 应该只接受传入的 HTTP2 连接,读取所有请求标头和整个正文,例如最大 260 MB,然后连接到后端服务器。目前,它似乎更快地连接到后端服务器,然后等待timeout server
来自最终用户的字节,然后 HAProxy 终止连接。