NGINX split_clients 모듈을 이용하여 카나리 배포를 진행하는 방법
Canary 배포 방식은 특히 트래픽 비율을 조정하여 새로운 버전의 안정성을 실시간으로 검증할 수 있기 때문에 매우 유용합니다. 문제가 발생하면 기존 버전으로 Rollback 할 수 있어 서비스의 안정성을 보장할 수 있습니다. NGINX의 ngx_http_split_clients_module 모듈을 활용하면 클라이언트의 트래픽을 세밀하게 분할하고, NGINX에서의 Canary 배포를 진행할 수 있습니다.
목차
1. 카나리 배포 란?
2. ngx_http_split_clients_module란?
3. NGINX에서 카나리 배포를 진행하는 방법
4. 결론
1. 카나리 배포 란?
카나리 배포란 이전 버전과 신규 버전을 둘 다 동시에 배포하고 트래픽의 비율을 조정하여 신규 버전으로 트래픽을 점진적으로 이동시키는 방식입니다.
이를 통해 새로운 버전의 안정성을 실시간으로 검증하면서, 문제가 발생할 경우 이전 버전으로 롤백하여 문제를 해결 하기 전까지 기존 버전을 사용할 수 있습니다.

2. ngx_http_split_clients_module란?
ngx_http_split_clients_module는 분할 테스트라고 알려진 A/B 테스트에서 유용하게 사용될 수 있습니다.
구문 : split_clients string $variable { ... }
기본 값: —
사용되는 블록: http
clients를 String 변수에 따라 지정된 변수에 랜덤하게 값을 지정합니다.
1 http {
2 split_clients "${remote_addr}AAA" $variant {
3 0.5% .one;
4 2.0% .two;
5 * "";
6 }
7
8 server {
9 location / {
10 index index${variant}.html;
11 }
12 }
13 }
2 : 클라이언트의 IP를 기반으로 트래픽을 분할합니다.
3 : 0.5%의 트래픽은 $variable 변수에 .one이라는 값이 들어가 index.one.html 정적 파일을 보여줍니다.
4 : 2%의 트래픽은 $variable 변수에 .two이라는 값이 들어가 index.one.html 정적 파일을 보여줍니다.
5: 그 이외의 나머지 트래픽은 index.html 정적 파일을 보여줍니다.
10 : split_clients에서 지정한 변숫값을 가지고 index.one.html, index.two.html, index.html 정적 파일중 한 가지의 정적 파일을 보여줍니다.
ngx_http_split_clients_module 모듈에서 트래픽을 분할하는 방식은 MurmurHash2를 사용하여 해시 한 후 해시한 값이 범위에 해당되는지 확인하여 변수에 지정합니다.
ex)
split_clients "${remote_addr}AAA" $variant {
0.5% .one;
2.0% .two;
* "";
}
만약 ip의 값이 192.168.0.1일 때 MurmurHash2를 사용하여 192.168.0.1AAA를 해시합니다. 1079865832
MurmurHash2는 32비트 숫자를 해시하는 알고리즘이기 때문에 최대 4294967295(32비트 숫자) 숫자를 각각 0.5%, 2.0%, 97.5%로 나눕니다. (0~21474835(0.5%) 21474836~107374180(2.0%) 107374181~4294967295(97.5%))
해시한 값이 어디에 해당되는지 NGINX 에서 판단하여 변수에 값을 지정합니다.
192.168.0.1의 IP는 index.html의 정적페이지를 확인할 수 있습니다. (1079865832(해시값)의 값이 107374181 ~ 4294967295에 해당)
3. NGINX에서 카나리 배포를 진행하는 방법
NGINX에서 카나리 배포를 진행하는 방법입니다.
백엔드 서버를 배포합니다.
version 1 – 192.168.201.28

version 2 – 192.168.201.27

ngx_http_split_clients_module 모듈을 이용하여 70:30 비율로 30%의 사용자만 신규 버전을 사용할 수 있도록 진행합니다.
1 split_clients $request_id $backend {
2 70% 28;
3 30% 27;
4 }
5
6
7 server {
8 listen 8092;
9 location / {
10 proxy_pass http://192.168.201.$backend;
11 }
12 }
1 : 해시 변수를 request_id로 지정하여 랜덤하게 분산될 수 있도록 지정하였습니다.
2 : 70%의 사용자는 192.168.201.28 – version 1 서버로 프록시됩니다.
3 : 30%의 사용자는 192.168.201.27 – version 2 서버로 프록시됩니다.
12 : proxy_pass에 변수에 따라 백엔드로 트래픽이 흐를 수 있도록 지정합니다.
파이썬 코드를 이용하여 <h1></h1> html 태그 안에 있는 Version 1과 2를 판단하여 집계한 후 70:30 비율이 나오는지 확인합니다. 코드는 NGINX STORE GitHub에서 확인할 수 있습니다.
split_clients는 랜덤 값으로 변수를 지정하기 때문에 70:30 근삿값을 보여주는 것을 확인할 수 있습니다.

트래픽 비율을 높여 30%의 사용자는 Version1 서버로 프록시, 70%의 사용자는 Version 2로 프록시합니다.
1 split_clients $request_id $backend {
2 30% 28;
3 70% 27;
4 }
5
6 server {
7 listen 8092;
8 location / {
9 proxy_pass http://192.168.201.$backend;
10 }
11 }
2 : 30%의 사용자는 192.168.201.28 – version 1 서버로 프록시됩니다.
3: 70%의 사용자는 192.168.201.27 – version 2 서버로 프록시됩니다.
트래픽 비율이 변경되었는지 확인합니다.

트래픽 비율이 변경된 것을 확인할 수 있습니다.
Version 2로 완전한 트래픽 이전을 진행합니다.
1 split_clients $request_id $backend {
2 * 27;
3 # 0% 28;
4 }
5 server {
6 listen 8092;
7 location / {
8 proxy_pass http://192.168.201.$backend;
9 }
10
11 }
2 : 192.168.201.27 – Version 2 서버가 모든 트래픽을 받을 수 있도록 지정하였습니다.
3 : split_clients에서 0% 비율은 사용할 수 없기 때문에 이전 서버는 주석 처리 or 제거합니다.

이전 버전에서 신규 버전으로 트래픽이 변경된 것을 확인할 수 있습니다.
4. 결론
카나리 배포는 신규 버전의 안정성을 점진적으로 검증할 수 있는 효율적인 방식으로, 트래픽 비율을 조정하여 사용자에게 신규 버전을 안전하게 배포할 수 있었습니다.split_clients를 통해 트래픽을 효율적으로 분배하고, 원하는 비율로 트래픽을 분산시킬 수 있습니다.
이를 통해 서비스의 가용성을 높이고, 새로운 버전의 문제를 최소화하면서 롤백할 수 있는 안전한 배포가 가능합니다.
최종적으로, 점진적인 트래픽 이동을 통해 서비스 안정성을 확보하며, 실시간 모니터링으로 리스크를 최소화하는 것이 핵심입니다. 카나리 배포는 단순한 배포가 아니라, 품질과 리스크 관리를 동시에 해결하는 전략입니다.
NGINX 카나리 배포 이외의 NGINX를 이용한 다양한 활용 방법을 더 알고싶으시다면 NGINX STORE NGINX 카테고리를 방문하여 더 많은 정보를 확인할 수 있습니다.
댓글을 달려면 로그인해야 합니다.