Haproxy http-buffer-request 不起作用

Nik*_*iko 2 haproxy

我无法让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
Run Code Online (Sandbox Code Playgroud)

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

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

Nik*_*iko 5

tldr; 它没有。使用NGinX。

同时,我从 Haproxy 邮件列表中得到了答复。谢谢, Holger 只是为了答复。

(元:我什至不确定邮件列表是否仍然有效,因为我在发布到列表时返回了错误。)

如果我仔细阅读了文档,也许这句话就不会引起我的注意:

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

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

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