В моих конфигурациях haproxy я устанавливаю таблицу размеров 5, в которой хранятся все входящие IP-адреса (в течение 1 минуты), и она установлена как nopurge
поэтому новые записи не будут храниться в таблице. Я бы хотел, чтобы им отказали, но этого не происходит.
Линия палки-стола:
stick-table type ip size 5 expire 1m nopurge store gpc0
А целые конфиги такие:
global
maxconn 30000
ulimit-n 65536
log 127.0.0.1 local0
log 127.0.0.1 local1 debug
stats socket /var/run/haproxy.stat mode 600 level operator
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
backend fragile_backend
tcp-request content track-sc2 src
stick-table type ip size 5 expire 1m nopurge store gpc0
server fragile_backend1 A.B.C.D:80
frontend http_proxy
bind *:80
mode http
option forwardfor
default_backend fragile_backend
Я подтвердил (подключение к статистике haproxy с помощью socat readline /var/run/haproxy.stat
), что таблица стикеров заполняется 5 IP-адресами, но затем каждый последующий запрос с нового IP просто проходит напрямую - он не добавляется в таблицу стикеров, ничего не удаляется из таблицы стикеров и запрос не отклонен.
Что я хотел бы сделать, так это отклонить запрос, если таблица Stick заполнена. Это возможно?
Я использую haproxy 1.5.
Как я уже говорил в другом потоке, для этого требуется добавление очень простого ACL, чтобы сообщить количество записей, используемых в таблице. Думаю, это не более 10 строк кода, включая объявление функции, но нам нужно его добавить. У меня сейчас нет времени, поэтому я добавляю это в список TODO и приму взнос, если кто-то найдет для этого время.
Похоже, что это не то поведение, которое должно происходить из-за того, как сформулирована документация. Но, может быть, вы можете увеличить GPC для каждого IP в таблице и отрицать, если он равен нулю ?:
src_get_gpc0(table) <integer>
Returns the value of the first General Purpose Counter associated to the
connection's source IPv4 address in the current proxy's stick-table or in
the designated stick-table. If the address is not found, zero is returned.
See also sc1/sc2_get_gpc0 and src_inc_gpc0.
При этом ваш бэкэнд называется «fragile_backend». Если вы пытаетесь ограничить количество подключений к серверу, поскольку сервер может обрабатывать только определенное количество подключений одновременно, вы можете захотеть использовать maxconn
параметр в определении вашего сервера. Используя это, HAPRoxy будет ставить в очередь соединения сверх этого количества. Вам также может быть интересно:
be_conn <integer>
be_conn(backend) <integer>
Applies to the number of currently established connections on the backend,
possibly including the connection being evaluated. If no backend name is
specified, the current one is used. But it is also possible to check another
backend. It can be used to use a specific farm when the nominal one is full.
See also the "fe_conn", "queue" and "be_sess_rate" criteria.