Создаём простую конфигурацию 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 тестирование различных частей сайта или веб-приложения.
А можно ли добавить фильтры, чтобы в A/B-тест попадали только новые пользователи (Номер визита = 1)?