Nginx и A/B тесты

Создаём простую конфигурацию Nginx, позволяющую организовать split-тестирование разных разделов или страниц ресурса.

Примеры конфигурации.

В Nginx предусмотрена специальная директива split_clients, с её помощью мы можем задать переменные для a/b тестирования и провести его.

Простейшая реализация конфигурации для теста разных страниц будет выглядеть следующим образом:

http {
...
 split_clients "${remote_addr}AAA" $variant {
 20% .first;
 30% .second;
 * "";
 }
...
server {
...
 location / {
 index index${variant}.html;
...

Здесь в секции http мы в рамках переменной variant определяем три возможных варианта с нужной нам вероятностью. Затем, уже в секции server, в нужном нам location мы просто подставляем переменную в адрес страницы, после чего, наши пользователи, с учётом заданной ранее вероятности будут попадать на одну из них. Разумеется, странички index.first.html, index.second.html и index.html должны быть подготовлены заранее.

Очень похожим способом, но с добавлением редиректа, мы можем организовать тестирование разных разделов сайта. Конфигурация, при этом, будет такой:

http {
...
 split_clients "${remote_addr}AAA" $destination {
 30% https://sysadmin.pm/first/;
 20% https://sysadmin.pm/second/;
 10% https://sysadmin.pm/third/;
 40% https://sysadmin.pm/main/;
}
...
server {
 rewrite ^/need-test/$ $destination redirect;
}

В примере выше, перечислены четыре варианта адресов для редиректа и их вероятность, а в секции server просто выполняется сами редирект, с учётом определённых в рамках split_clients переменных.

И конечно же, мы можем применить и proxy_pass по аналогии. В этом случае, конфигурация будет выглядеть примерно так:

http {
...
 upstream ver_a {
 server 1.2.3.4:8001;
 }

upstream ver_b {
 server 1.2.3.4:8002;
 }

split_clients "${arg_token}" $appver {
 80% ver_a;
 * ver_b;
 }
...
server {
...
 location / {
 proxy_set_header Host $host;
 proxy_pass http://$appver;
 }

В примере выше у нас определены два приложения, которые размещены на разных портах, с помощью split_clients заданы параметры для split-тестирования (в том числе и заранее предусмотренный token, который будет передаваться в запросе), а уже в рамках location с помощью proxy_pass запрос передаётся на нужный бекенд.

Проверяем работу.

Быстро проверить работает ли редирект можно, например, с помощью сервиса ping-admin.ru. Допустим у нас есть простой тест:

split_clients "${remote_addr}AAA" $destination {
 50% https://sysadmin.pm/first/;
 50% https://sysadmin.pm/second/;
 }
...
rewrite ^/need-test/$ $destination redirect;

Открываем сервис и переходим к проверке доступности сайта. Вводим адрес https://sysadmin.pm/need-test/ Выбираем несколько локаций и запускаем проверку. В результатах проверки можно будет увидеть, как при обращении к URL выполняются редиректы:

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

@SysadminNotes | https://sysadmin.pm

One thought on “Nginx и A/B тесты

  1. А можно ли добавить фильтры, чтобы в A/B-тест попадали только новые пользователи (Номер визита = 1)?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *