NGINX A/B 테스트 구현, split_clients 모듈 활용하기

이번 포스트에서는 ngx_http_split_clients_module을 사용하여 NGINX A/B 테스트 구성하는 방법에 대해 설명합니다. ngx_http_split_clients_module은 분할 테스트라고 알려진 A/B 테스트에 적합한 변수를 사용하여 A/B 테스트를 진행할 수 있는 모듈입니다.

이 모듈은 MurmurHash2를 사용하여 요청을 해시하고 분할합니다. 예를 들어, 클라이언트 IP를 해시하면 각 사용자가 A/B 테스트 그룹에 무작위로 배정되어 행동에 따른 편향을 줄이고, 공정한 비교가 가능해집니다. 이를 통해 A/B 테스트를 효과적으로 수행할 수 있습니다.

목차

1. A/B 테스트란?
2. ngx_http_split_clients_module의 이해
3. NGINX A/B 테스트
4. NGINX A/B 테스트 사용 사례
5. NGINX A/B 테스트 결론

1. A/B 테스트란?

A/B 테스트는 두 가지 이상의 버전(예: 웹 페이지, 앱 인터페이스, 마케팅 캠페인 등)을 비교하여 어떤 것이 더 효과적인지를 평가하는 실험 방법입니다. 일반적으로 A/B 테스트는 다음과 같은 절차로 진행됩니다.

두 가지 이상의 버전을 비교하여 사용자 반응을 분석하고, 분석을 통해 더 긍정적인 버전을 선택하여 사용자 경험을 개선하고, 비즈니스 성과를 향상시킬 수 있는 유용한 방법입니다.

마케팅, 웹 디자인, 제품 개발 등 다양한 분야에서 널리 활용되고 있으며, 데이터 분석과 실험적 접근이 결합된 효과적인 전략입니다.

2. ngx_http_split_clients_module의 이해

ngx_http_split_client_module은 A/B 테스트, 즉 분할 테스트에 적합한 변수를 사용하여 테스트할 수 있는 모듈입니다.

Syntax:	        split_clients string $variable { ... }
Default:	—
Context:	http

아래는 split_clients의 사용 예시입니다. 이 예시에서는 클라이언트 IP 주소를 기반으로 트래픽을 분배하며, 두 가지 버전의 페이지(old와 new)를 제공합니다.

http {
        
        split_clients $remote_addr $variant {
                       30%             new;
                       *               old;
        }
        
        server {
                
                listen 80;
                
                location / { 
                        root /usr/share/nginx/html;
                        index $variant.html;
                }
        }
}

split_clients 지시문에서 $remote_addr 변수를 기반으로 트래픽을 분배합니다. 따라서 클라이언트 IP를 기준으로 30% 확률로 new 버전으로 할당되며, 나머지는 70% 확률로 old 버전으로 할당됩니다.

할당 받은 그룹을 기준으로 old.html 또는 new.html을 응답하게 됩니다.

3. NGINX A/B 테스트

테스트에서는 아래 구성과 같이 $remote_addr 값으로 A/B 테스트를 진행하기에는 어려움이 있을 수 있습니다. 그 이유는 $remote_addr 즉 클라이언트의 IP가 해시되어 한 버전에만 요청이 가기 때문입니다.

http {
        
        split_clients $remote_addr $variant {
                       30%             new;
                       *               old;
        }
        
        server {
                
                listen 80;
                
                location / { 
                        root /usr/share/nginx/html;
                        index $variant.html;
                }
        }
}

그렇기에 $remote_addr 값을 임시로 $time_local 등으로 변경하여 A/B 테스트가 작동하는지 확인할 수 있습니다.

http {

        split_clients $request_id $version {
                       30%             new;
                       *               old; 
        }
        
        server {
        
                listen 80;
                
                location / {
                        root /usr/share/nginx/html;
                        index $variant.html;
                }
        }
}

각각 old.html과 new.html은 아래와 같습니다.

nginx a/b 테스트

테스트를 위해 간단한 bash 스크립트를 작성합니다.

# 초당 1번 씩 10번 curl 명령을 실행하는 스크립트

for i in {1..10}; do
        curl http://example.com
        sleep 1
done

위의 스크립트를 실행시켜, 30% 확률로 new.html, 그 외 70% 확률로 old.html이 응답하는지 확인합니다.

nginx a/b 테스트

ngx_http_split_client_module 모듈의 분배는 확률에 기반한 것이므로 위와 같이 정확히 3:7의 결과가 나오지 않을 수 있습니다.

하지만 요청 수가 많아질 수록 설정한 비율에 더 가까워지는 결과를 얻을 수 있습니다.

즉, new version을 응답받을 확률이 30%라고 생각하면 됩니다.

4. NGINX A/B 테스트 사용 사례

A/B 테스트는 두 가지 이상의 버전을 비교하여 특정 변화가 성능 또는 사용자 경험에 미치는 영향을 측정하는 방법으로, 다양한 분야에서 사용되고 있습니다.

  1. 웹사이트 및 애플리케이션 UI/UX 개선
    • 버튼 위치, 색상, 문구 등 UI 요소를 A/B 테스트하여 사용자 반응을 분석합니다. 예를 들어, CTA(Call to Action) 버튼의 색상이나 위치 등을 변경했을 때의 클릭률을 확인할 수 있습니다.
  2. 광고 캠페인 최적화
    • 두 가지 이상의 광고 버전을 테스트하여 클릭률, 전환율이 더 높은 버전을 찾아내어 광고 예산을 효과적으로 사용합니다.
  3. 제품 가격 테스트
    • 특정 제품에 대해 서로 다른 가격을 A와 B로 나누어 잠재 고객을 유지하고 이상적인 가격을 결정할 수 있습니다.
  4. 퍼포먼스 최적화
    • 페이지 로딩 속도, 결제 프로세스 속도와 같은 성능 요소를 개선하기 위해 A/B 테스트를 사용해 어떤 최적화 방법이 사용자 경험에 긍정적인 영향을 미치는지 확인할 수 있습니다.

위의 리스트 외에도 다양한 분야와 다양한 목적에서 A/B 테스트를 사용해 데이터를 기반으로 최적의 전략을 사용할 수 있습니다.

이 예시는 웹사이트의 UI 요소를 개선하여 클릭률을 확인 및 개선하는 예시입니다.

old version(192.168.201.101)의 웹사이트는 아래와 같습니다. nginxstore.com 사이트로 유도하기 위해 nginxstore.com 문구를 <a> 태그로 설정한 페이지입니다.

nginx a/b 테스트

<a>태그에 css를 적용하여 강조했음에도 클릭률이 저조하여 다른 vm에 new version(192.168.201.102)을 생성하고 A/B 테스트를 진행합니다.

nginx a/b 테스트

이 예시에서는 old version(192.168.201.101)과 new version(192.168.201.102)를 구분하여 A/B 테스트를 진행합니다. 따라서 NGINX의 구성은 아래와 같습니다.

http {
    split_clients $remote_addr $variant {
                   10%             new; # UI를 변경한 신규 페이지
                   *               old; # <a> 태그로 설정한 기존 페이지
    }

    upstream old {
        zone old 64k;
        server 192.168.201.101;
    }

    upstream new {
        zone new 64k;
        server 192.168.201.102;
    }

    server {

        listen 80;
        
        location / {
                proxy_pass http://$variant;
        }
    }
}

위의 설정을 적용하면, 사용자는 10% 확률로 new 변수를 할당 받고, proxy_pass http://new; 로 프록시되어 신규 페이지를 반환 받습니다. 그외 사용자는 기존 사용하던 <a> 태그로 설정된 old 변수가 할당되어 proxy_pass http://old; 로 프록시되어 기존 페이지를 반환 받게 됩니다.

NGINX Plus를 사용하면 실시간 모니터링 대시보드에서 비율을 확인할 수 있습니다. 받은 요청 부분만 확인해보면, 10000개의 요청 중, new version에 1002개 old version에 8998개의 요청이 전달된 것을 확인할 수 있습니다.

5. NGINX A/B 테스트 결론

NGINX의 split_clients 모듈을 활용하면 간단하고 효율적으로 A/B 테스트를 구현할 수 있습니다. 이 모듈을 통해 트래픽을 원하는 비율로 나누어 각 버전의 성능과 사용자 반응을 비교할 수 있으며, 이를 통해 제품 및 서비스의 개선에 중요한 인사이트를 얻을 수 있습니다.

추가적으로, NGINX의 유연한 구성 설정과 다양한 모듈은 split_clients 외에도 다른 테스트 시나리오와 연계할 수 있는 강력한 도구임을 보여줍니다. 만약 특정 사용자의 테스트 그룹을 고정하여 유지해야 한다면, 쿠키나 세션 데이터를 활용하는 방법도 고려해 볼 수 있습니다. 이렇게 쌓인 데이터는 최적화 결정에 중요한 자료가 될 것이며, 지속적인 A/B 테스트를 통해 사용자 경험을 향상시키고, 결과적으로 비즈니스 성과를 극대화할 수 있습니다.

앞으로도 split_clients 모듈 외의 다양한 NGINX 기능을 활용해 A/B 테스트를 비롯한 다양한 트래픽 제어 및 최적화 방법을 시도해 보시기를 권장합니다. 또한 NGINX Plus를 사용하여 A/B 테스트를 실시간 모니터링하고, 실시간 트래픽을 확인하여 A/B 테스트를 즉각적으로 확인해보세요.

NGINX Plus를 직접 사용해 보시려면 30일 무료 평가판을 신청하거나 NGINX STORE에 연락하여 논의하십시오.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required