Я не могу получить Параметр 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-атак. Я думаю, что злоумышленник просто снизит скорость передачи данных после первого фрагмента. Но это обсуждение выходит за рамки этого вопроса.