Haproxy http-buffer-request 不起作用

Haproxy http-buffer-request 不起作用

我无法得到Haproxys http-buffer-request 选项正在运行。我使用的是 Haproxy 1.6.5。这是我的配置:

global
  maxconn 20000
  debug

defaults HTTP
  mode  http
  option  http-buffer-request  # buffer the whole request before dispatching it to the backend
  timeout connect  5s
  timeout client  50s
  timeout server  50s

frontend http
  bind 127.0.0.1:8123
  use_backend api.radioadmin_backend if { hdr(host) -i api.radioadmin.local:8123 }
  use_backend radioadmin_backend if { hdr(host) -i radioadmin.local:8123 }

backend api.radioadmin_backend
  mode  http
  server api.radioadmin3000 127.0.0.1:3000 check

backend radioadmin_backend
  mode  http
  server radioadmin3001 127.0.0.1:3001 check

但是请求并没有在 Haproxy 中缓冲,而是直接发送到应用程序:

我正在使用 Unicorn 运行 Ruby 应用程序。如果 Unicorn 工作者处理请求的时间超过 10 秒,它们就会被杀死。我正在使用 Chrome 上传文件,并在开发工具中限制带宽。我期望 Haproxy 缓冲 POST 请求直到它完成,然后才将其发送到 Ruby 应用程序。但事实并非如此。我不知道我做错了什么。任何帮助都非常感谢。

答案1

tldr;不是。使用 NGinX。

与此同时,我得到了来自 Haproxy 邮件列表的答复。谢谢,Holger 谢谢你的回复。

(元:我甚至不确定邮件列表是否仍然有效,因为我在向列表发帖时收到了错误。)

如果我仔细阅读了文档,也许这句话就不会被我忽视:

放置在前端或后端的此选项强制 HTTP 处理等待,直到收到整个主体,或请求缓冲区已满,或者在分块编码的情况下第一个块完成。

这仅仅意味着 Haproxy 永远不会完全缓冲大型上传主体。邮件列表中的建议是使用 NGinX。

我还是不明白 Haproxy 如何防范慢速 POST 攻击。我认为攻击者只会在第一个块之后降低数据速率。但这个讨论超出了这个问题。

相关内容