Я очень запутался и не могу найти ответ: что может привести к остановке выполнения строк конфигурации в haproxy или все они будут выполнены и оценены в конце?
У меня сложилось впечатление, что if условное http-запрос отказать [...]
сработает, выполнение тут же остановится, но тогда некоторые примеры не имеют никакого смысла.
Пример (из документы):
интерфейс fe_main
связать :80
# определить таблицу палочек
тип палки-таблицы размер IP-адреса 100 КБ срок действия 24 часа хранить http_req_rate (5s), gpc0, gpt0
# начать отслеживать запросы, где ключ в таблице
# исходный IP-адрес клиента
http-запрос track-sc0 src
# клиент превысил 20 запросов за 5 секунд?
acl превышает_rate_limit sc_http_req_rate(0) gt 20
# отметить их, если они превысили лимит
http-запрос sc-set-gpt0(0) 1, если превышает_rate_limit
# если они превысили лимит в 3 раза, отметить их как известных спидеров
acl known_speeder sc_get_gpc0(0) ge 3
# запретить всех клиентов, которые превышают лимит или известны как спидеры
http-запрос запрещает deny_status 429, если превышает_rate_limit || известный_спидер
# считать каждый раз, когда они превышают лимит, если они были помечены
acl issue_speeding_ticket sc_get_gpt0(0) eq 1
http-запрос sc-inc-gpc0 (0), если issue_speeding_ticket
# сбросить флаг
http-запрос sc-set-gpt0 (0) 0
default_backend be_servers
Если http-запрос отклонить
остановит выполнение (как я и думал), то в двух случаях это не сработает, как предполагалось, верно?
- Если клиент отправляет устойчивую нагрузку HTTP-запросов, превышающую лимит, acl
превышает_rate_limit
оценивается как true, поэтому http-запрос отклонить
сделает sc-inc-gpc0
линия недоступна, штраф за превышение скорости выписываться не будет.
- Если клиент превысит ограничение скорости, а затем остановится навсегда, штраф за превышение скорости не будет выдан, поскольку последний запрос был отклонен, как и в предыдущем случае.
- Если клиент превышает лимит скорости, а затем замедляется, чтобы больше не превышать лимит (и, таким образом, снова ведет себя), будет выписан штраф за превышение скорости. Это противоположно тому, что я ожидал.
Если http-запрос отклонить
не останавливает выполнение, то очень неоднозначно, что будет с запросом? Что, если другой http-запрос
совпадения строк; выиграет ли последний?
Более общая картина здесь заключается в том, что я пытаюсь выполнить что-то похожее на пример использования.Мне нужна таблица, в которой указано, сколько раз исходный IP-адрес достигал ограничения скорости (но только один раз для поддержания состояния превышения ограничения скорости).
Мне не удалось найти в документации авторитетный источник о порядке выполнения правил в файлах конфигурации haproxy. Возможно, я что-то упускаю.