Конфигурирование цепочек#
Механизм работы#
Механизм цепочек действий выглядит следующим образом:
Каждая объявленная цепочка есть дерево действий, в общем случае независимая друг от друга.
Выполнение каждой цепочки инициируется последовательно, однако, в общем случае не гарантируется, что запуск следующей цепочки произойдет до окончания предыдущей.
Цепочки гарантировано будут выполнены последовательно только в том случае, если не существует ни одного отложенного (асинхронного) действия ни в одной из них. В настоящий момент существуют определенные асинхронные действия - AntivirusFileChecker и ICAPFileChecker.
Основной смысл объединения действий в одну цепочку заключается в возможности, инициализируя корневое действие одним сообщением, выполнять цепочку преобразований и проверок над ним и получающихся в результате преобразований над ним данных.
Если результат выполнения действий не зависит друг от друга, то их не следует размещать в одной цепочке.
Если в цепочке находится действие, принимающее на вход сообщение, то данное сообщение должно быть определено либо как сообщение, которым инициализировалась цепочка, либо как сообщение, которое создано предыдущим действием.
Действия манипулятора с переменными могут располагаться в любом месте цепочки, однако при этом следует учитывать, что требования в п. 6 должны выполняться.
Конфигурирование цепочек#
Пример конфигурационного файла с использованием цепочек приведен в разделе.
Рассмотрим структуру и назначение элементов.
Элемент chains объявляется внутри элементов — сервисов и является корневым для все цепочек действий. В зависимости от того, к какому объекту, request или response, применяется цепочка действий, объявляется секция request_chains или response_chains, при этом обе секции могут быть объявлены одновременно. В каждой из этих секций может быть объявлен список цепочек, каждый элемент из которых имеет следующие параметры:
Параметр |
Возможные значения |
Обязательность |
Описание |
|---|---|---|---|
action |
Одно из перечисленных действий выше |
да |
Действие, которое является корневым в данной цепочке (с которого начинается обработка) |
actions |
Список дочерних действий, каждый элемент которого также является действием |
нет |
Действия, которые будут выполнены после выполнения корневого действия. Максимальный уровень вложенности в настоящий момент = 10 |
message |
Сообщение, которое поступает на вход корневому действию. Может быть либо выражением из переменных nginx, либо использовать значения $clj_request_body - для тела запроса, либо $clj_response_body (может быть использовано только для response_chains) |
нет |
Обязательно для тех действий, у которых заполнен столбец «Вход» в таблице на страницах «Проверяющие действия», «Преобразователи сообщений» и «Манипуляторы с переменными». Важно! Контроль того, определен message или нет, осуществляется только в runtime — если на вход действию придет незаполненное сообщение, то будет сгенерирована ошибка |
phase |
Фаза обработки, одно из значений — rewrite/access |
нет |
Используется только для request_chains, по умолчанию - access. Задавать этот параметр нужно только в том случае, когда какие-либо параметры заполняются на определенной фазе, либо используются значения переменных, заполняемые на определенной фазе, обычно нативными модулями |
И для цепочки обработки запросов, и для цепочки обработки ответов могут быть заданы дополнительные параметры.
Для request_chains в секции request_chain_properties:
Параметр |
Возможные значения |
Обязательность |
Описание |
|---|---|---|---|
error_state_code |
HTTP-статус ответа |
нет |
HTTP статус ответа, который будет возвращаться в случае ошибки — по умолчанию - 500 |
failed_check_state_code |
HTTP-статус ответа |
нет |
HTTP статус ответа, который будет возвращаться в случае блокировки запроса/ответа проверяющим действием, по умолчанию — 403 |
max_buffer_size |
1; Kb; Мб |
нет |
Объем памяти для внутренней буферизации (служебное значение, менять не рекомендуется) |
max_inmemory_size |
kb/Мб |
нет |
Максимальный размер памяти, который одномоментно может взять из памяти любое действие — по умолчанию 1Mb |
output_buffer_size |
kb/Мб |
нет |
Размер буфера для записи в файл в случае, если размер тела превышает max_inmemory_size |
input_buffer_size |
kb/Мб |
нет |
Размер буфера для чтения тела запроса/ответа |
temp_file_path |
/tmp |
нет |
Директория для хранения временных файлов |
resp_gen_rules_file |
путь к файлу |
нет |
YAML файл правила, который описывает, как заполнять файл паттерна |
resp_gen_content_type |
путь к файлу |
нет |
Тип контента для заголовка ответа |
resp_gen_pattern_file |
„application/json“ |
нет |
Файл паттерна |
chains_tracing |
- |
нет |
Последовательность параметров Параметр chains_tracing |
required_action_request |
- |
нет |
Последовательность параметров Параметр required_action_request |
Для response_chains в секции response_chain_properties:
Параметр |
Возможные значения |
Обязательность |
Описание |
|---|---|---|---|
error_state_code |
HTTP-статус ответа |
нет |
HTTP статус ответа, который будет возвращаться в случае ошибки — по умолчанию - 500 |
failed_check_state_code |
HTTP-статус ответа |
нет |
HTTP статус ответа, который будет возвращаться в случае блокировки запроса/ответа проверяющим действием, по умолчанию — 403 |
max_buffer_size |
1; Kb; Мб |
нет |
Объем памяти для внутренней буферизации (служебное значение, менять не рекомендуется) |
max_inmemory_size |
kb/Мб |
нет |
Максимальный размер памяти, который одномоментно может взять из памяти любое действие — по умолчанию 1Mb |
skip_on_error_stage_before |
on/off |
нет |
Определяет, выполнять ли цепочку действий, если цепочка на фазе запроса завершилась с ошибкой или блокировкой запроса |
use_post_processor |
true/false |
нет |
Определяет, использовать ли пост-обработку для генерации ответа |
(deprecated) resp_gen_modify |
on/off |
нет |
Включение переопределения тела ответа для ответов с backend (успешно прошедших проверку и не с ошибочным статусом) |
chains_tracing |
- |
нет |
Последовательность параметров Параметр chains_tracing |
required_action_request |
- |
нет |
Последовательность параметров Параметр required_action_request |
Переменные#
Для получения информации о результате выполнения цепочек определены следующие переменные:
clj_request_chain_result
Результат выполнения цепочки действий над запросом.
Возможные варианты:
complete, deny, error;
complete — выполнено без ошибок;
deny — заблокировано;
error — ошибка.
clj_error_action
Действие, вызвавшее блокировку/ошибку — начиная с версии 2.2.
clj_processing_phase
Фаза выполнения цепочки, request или response.
clj_response_chain_result
Результат выполнения цепочки действий над ответом.
Возможные варианты:
complete, deny, error;
complete - выполнено без ошибок;
deny - заблокировано;
error -ошибка.
При описании цепочек, если предполагается заполнять какие-либо переменные, отличные от встроенных, то необходимо объявлять их либо с префиксом clj_ либо объявлять их в конфигурации с использованием директивы set_varialble в секции optional сервиса.
Переменные для доступа к содержимому данных запроса ответа:
clj_message_mime_type
MIME-тип текущего сообщения.
clj_request_body
Тело запроса.
clj_response_body
Тело ответа.
Конфигурирование действий#
Рассмотрим определение действия:
- action: AnyAction
conditions:
{список условий}
params:
{список параметров}
{actions:}
Определение каждого действия состоит собственно из названия действия (элемент из перечисленных действий), условий, при которых данное действие выполняется (conditions) — безотносительно того, какое это действие, данный элемент используется универсально (при этом может отсутствовать, если действие должно выполняться всегда, если до него дошла очередь), секции специфичных параметров действия — params (какие параметры должны задаваться определяется реализацией действий) и список дочерних действий, каждый из которых рекурсивно имеет такую же структуру.
Каждое условие состоит из трех элементов:
var — переменная или выражение из переменных
val — значение с которым будет сравниваться значение var. В качестве val может использоваться:
константа;
переменная, их сочетания или сочетания с константами;
данные из файла.
operator — операция сравнения, одно из значений:
«=» — равенство (при сравнении строк используется посимвольное сравнение);
«>» — больше, для числовых значений;
«<» — меньше, для числовых значений;
«>=» — больше или равно, для числовых значений;
«<=» — меньше или равно, для числовых значений;
«in» — вхождение в перечисление;
«not_in» — отсутствие вхождения;
«!=» — неравенство значений;
«~» — регулярное выражение с учетом регистра символов;
«~*» — регулярное выражение без учета регистра символов;
«!~» — негативное регулярное выражение с учетом регистра символов;
«!~*» — негативное регулярное выражение без учета регистра символов.