split_clients

Директива `split_clients` позволяет NGINX разделять клиентов на разные группы на основе указанного процента и выполнять различные действия для каждой группы. — NGINX HTTP Core

split_clients
http
Синтаксисsplit_clients $remote_addr % { weight1 block1; weight2 block2; ... };
По умолчаниюnone
Контекстhttp
МодульNGINX HTTP Core
Аргументыblock (2)

Описание

Директиву `split_clients` можно использовать в контексте `http` для упрощения A/B-тестирования и распределения трафика между несколькими бэкендами или конфигурациями. По сути, она направляет запросы от клиентов в один из нескольких определённых блоков на основе захешированного значения клиента, обычно IP-адреса клиента. Когда директива задана, она принимает один или несколько процентов и соответствующие блоки конфигурации. Первый аргумент `split_clients` указывает процент клиентских запросов, который должен соответствовать, чтобы вступил в силу первый блок, за которым следуют правила обработки таких клиентов. Каждый последующий блок может задавать дополнительные проценты, фактически создавая несколько «корзин» клиентов, где каждая корзина может маршрутизировать трафик по‑своему. Это полезно, например, при тестировании новых функций на подмножестве пользователей, в то время как остальным направляется стабильная версия. Чтобы проиллюстрировать, если 70% клиентов направляются на одну версию приложения, а оставшиеся 30% — на другую, директива `split_clients` может управлять этим разделением на основе хэша IP-адреса клиента. В результате отдельные пользователи последовательно попадают на ту версию, которой им назначено, в течение всей сессии, что делает её особенно эффективной для обеспечения согласованного пользовательского опыта в A/B-тестах и при постепенных развёртываниях.

Пример конфига

split_clients ${remote_addr}  70% { server server_v1; }
    30% { server server_v2; };

Убедитесь, что проценты в сумме по всем заданным блокам составляют 100%.

Переменная, используемая для хеширования (например, $remote_addr), должна быть стабильной между запросами, чтобы пользователи оставались в одном и том же бакете.

Избегайте использования сложных условий или данных с высокой кардинальностью, чтобы обеспечить сбалансированное распределение.