🔹 DevOps

Nginx Blue/Green Rolling 무중단 배포 실습 (초간단)

terranbin 2025. 4. 16. 13:04
728x90
SMALL
  • Rocky Linux 8.10 기반 실습용 가상 서버 대상
  • 3대 서버 (LB / APP-BLUE / APP-GREEN) 활용
  • Nginx upstream의 weight 설정을 통한 단계적 트래픽 전환 실습

1. 서버 구성

역할IP 주소설명

lb-server 192.168.56.101 Nginx 로드밸런서
app-blue 192.168.56.102 기존 서비스 버전 (v1)
app-green 192.168.56.104 신규 서비스 버전 (v2)
Client Server 192.168.56.103 curl request 날리는 서버

2. 모든 서버: Nginx 설치

sudo dnf install -y nginx
sudo systemctl enable --now nginx

3. APP 서버 HTML 페이지 설정

▶ app-blue (192.168.56.102)

echo "<h1>BLUE</h1>" | sudo tee /usr/share/nginx/html/index.html

▶ app-green (192.168.56.104)

echo "<h1>GREEN</h1>" | sudo tee /usr/share/nginx/html/index.html

4. lb-server Nginx 구성 파일 수정

/etc/nginx/nginx.conf 내부에 http {} 블록을 아래처럼 수정

-------------------------------------

http {
    upstream sungbin {
        server 192.168.56.102 weight=10;  # 초기: BLUE 100%
        server 192.168.56.104 down;   # 초기: GREEN 0%
    }

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
-------------------------------------------

▶ 프록시 설정을 /etc/nginx/conf.d/proxy.conf 파일로 분리

# /etc/nginx/conf.d/proxy.conf

server {
    listen 80 default_server;
    server_name _;                 # make default

    location / {
        proxy_pass http://sungbin; # request to upstream 'sungbin' block server
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

▶ Nginx 설정 적용

sudo nginx -t && sudo systemctl restart nginx
  • 화면에 진짜 나오는지 체크한다

5. 트래픽 분산 테스트

  • client 서버에서, Load Balancer 서버로 통신을 시켜보자
for i in {1..20}; do curl -s http://192.168.56.101 | grep -oE 'BLUE|GREEN'; done
  • 결과는 20대 0 이다


6. weight 자동 조정 스크립트

/usr/local/bin/switch-weight.sh

#!/bin/bash

BLUE_WEIGHT=$1
GREEN_WEIGHT=$2
NGINX_CONF="/etc/nginx/nginx.conf"

if [ -z "$BLUE_WEIGHT" ] || [ -z "$GREEN_WEIGHT" ]; then
  echo " Usage: $0 <blue_weight> <green_weight>"
  echo "  ex) $0 8 2"
  exit 1
fi

# 백업
cp -p "$NGINX_CONF" "$NGINX_CONF.bak.$(date +%s)"

# BLUE (192.168.56.102)
if [ "$BLUE_WEIGHT" = "0" ]; then
  sed -i 's/server 192.168.56.102.*/        server 192.168.56.102 down;/' "$NGINX_CONF"
else
  sed -i "s/server 192.168.56.102.*/        server 192.168.56.102 weight=$BLUE_WEIGHT;/" "$NGINX_CONF"
fi

# GREEN (192.168.56.104)
if [ "$GREEN_WEIGHT" = "0" ]; then
  sed -i 's/server 192.168.56.104.*/        server 192.168.56.104 down;/' "$NGINX_CONF"
else
  sed -i "s/server 192.168.56.104.*/        server 192.168.56.104 weight=$GREEN_WEIGHT;/" "$NGINX_CONF"
fi

nginx -t && nginx -s reload && echo "✅ Updated: BLUE=$BLUE_WEIGHT, GREEN=$GREEN_WEIGHT"

 

  • 실행 권한 추가
sudo chmod +x /usr/local/bin/switch-weight.sh
  • Test1) 현재 버전 9, 신규 버전 1로 설정한다
[root@master nginx]# switch-weight.sh 9 1
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
✅ Updated: BLUE=9, GREEN=1
  • client 에서 curl 명령어로, 9 대 1 이 적용되었나 확인

 

  • Test2) 현재 버전 5, 신규 버전 5로 설정한다
switch-weight.sh 5 5
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
✅ Updated: BLUE=5, GREEN=5

 

  • Test3) 현재 버전 0, 신규 버전 10 으로 설정한다
[root@master nginx]# switch-weight.sh 0 10
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
✅ Updated: BLUE=0, GREEN=10


✅ 실습 마무리

  • switch-weight.sh를 통해 rolling 전환이 간편하게 가능

사실 이는 기초이며,
추가적인 테스트를 한 뒤 kubernetes - deployment (blue/green) 티스토리 작성하겠다

LIST