Назад | Перейти на главную страницу

Haproxy http-buffer-request не работает

Я не могу получить Параметр HTTP-запроса-буфера Haproxys работает. Я использую 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, а отправляется непосредственно в приложение:

Я запускаю приложение Ruby с Unicorn. Рабочие Unicorn погибают, если им требуется больше 10 секунд на обработку запроса. Я загружаю файл с помощью Chrome и ограничиваю пропускную способность в инструментах разработчика. Я ожидал, что Haproxy буферизирует запрос POST до его завершения и только затем отправит его в приложение Ruby. Но это не так. Понятия не имею, что делаю не так. Любая помощь высоко ценится.

tldr; Это не так. Используйте NGinX.

Между тем я получил ответ из списка рассылки Haproxy. Спасибо, Хольгер. Просто за ответ.

(Мета: Я даже не был уверен, что список рассылки по-прежнему работает, потому что я получал сообщения об ошибках при отправке в список.)

Если бы я внимательно прочитал документацию, возможно, это предложение не ускользнуло бы от моего внимания:

Этот параметр, размещенный во внешнем или внутреннем интерфейсе, заставляет обработку HTTP ждать, пока не будет получено все тело, или буфер запроса не заполнится, или пока не будет завершен первый фрагмент в случае кодирования по фрагментам.

Это просто означает, что Haproxy никогда не будет полностью буферизовать большие загрузочные модули. В списке рассылки было рекомендовано использовать для этого NGinX.

Я до сих пор не понимаю, как Haproxy может защитить от медленных POST-атак. Я думаю, что злоумышленник просто снизит скорость передачи данных после первого фрагмента. Но это обсуждение выходит за рамки этого вопроса.