DevOps 가이드·약 7분 내외

Blue/Green 무중단 배포 — nginx로 트래픽 스위칭하기

서버를 배포할 때마다 서비스가 끊기는(Downtime) 문제를 해결합니다. 두 개의 똑같은 환경을 번갈아 띄우고 NGINX로 트래픽 방향만 바꿔주는 Blue/Green 무중단 배포의 원리와 쉘 스크립트 작성법을 알아봅니다.

아키텍처 구조도

다이어그램 렌더링 중...

무중단 배포가 왜 필요한가

새로운 기능을 배포할 때, 보통 기존 서버를 끄고 새 서버를 켜야 합니다. 이 과정에서 수 초~수 분 동안 접속이 안 되는 "다운타임"이 발생합니다.

일반 배포 (다운타임 발생)

  • 1. 기존 서버 종료 (이때부터 접속 불가)
  • 2. 새 이미지 다운로드
  • 3. 새 서버 부팅 (부팅 끝날 때까지 접속 불가)
  • 4. 배포 완료

Blue/Green 배포 (무중단)

추천
  • 1. 기존 서버(Blue)는 그대로 두고 접속 유지
  • 2. 새 서버(Green)를 백그라운드에서 부팅
  • 3. NGINX가 바라보는 방향을 Green으로 즉시 변경
  • 4. 기존 서버(Blue) 종료

Blue/Green 구조 이해하기

docker-compose.yml에 완전히 똑같은 백엔드 서비스를 이름만 다르게(blue/green) 두 개 만들어 둡니다.

docker-compose.yml
services:
  server-blue:
    image: my-backend-image
    ports:
      - "8000"  # 호스트 포트를 지정하지 않으면 Docker가 랜덤 포트 할당

  server-green:
    image: my-backend-image
    ports:
      - "8000"
nginx/upstream.conf
# NGINX가 트래픽을 보낼 목적지 변수
set $active_color "blue";

# nginx.conf의 proxy_pass는 이 변수를 바라봄
# proxy_pass http://server-$active_color:8000;

deploy.sh 쉘 스크립트 작성

배포 과정을 자동화하기 위해 쉘 스크립트를 작성합니다. 핵심은 "현재 떠 있는 게 Blue라면, 다음 띄울 건 Green"이라는 스위칭 로직입니다.

deploy.sh 핵심 로직
#!/bin/bash

# 1. 현재 NGINX가 바라보는 컬러 확인
CURRENT_COLOR=$(grep 'set $active_color' nginx/upstream.conf | awk -F '"' '{print $2}')

# 2. 띄울 대상 컬러 결정
if [ "$CURRENT_COLOR" == "blue" ]; then
    TARGET_COLOR="green"
else
    TARGET_COLOR="blue"
fi

echo "🚀 배포 시작: $TARGET_COLOR"

# 3. 새 서버(Target) 부팅
docker-compose up -d server-$TARGET_COLOR

Health Check (매우 중요)

왜 sleep 10초로 대충 기다리면 안 될까?

새 서버가 10초 만에 완벽히 켜진다는 보장이 없습니다. DB 연결이 지연되어 15초가 걸렸다면, 10초 뒤에 트래픽을 넘겼을 때 사용자들은 에러를 보게 됩니다. 따라서 서버가 "나 진짜 준비됐어"라고 응답할 때까지 계속 확인해야 합니다.

deploy.sh에 Health Check 추가
echo "⏳ 새 서버 부팅 대기 중..."
for i in {1..60}; do
    # curl 또는 wget으로 서버의 /api/health-check 경로 찔러보기
    if curl -s http://server-$TARGET_COLOR:8000/api/health-check > /dev/null; then
        echo "✅ 서버 부팅 완료!"
        
        # 4. 트래픽 스위칭 (nginx 설정 변경)
        sed -i "s/set $active_color ".*";/set $active_color "$TARGET_COLOR";/" nginx/upstream.conf
        
        # 5. nginx 리로드 (설정 즉시 반영, 트래픽 끊김 없음)
        docker-compose exec nginx nginx -s reload
        
        # 6. 옛날 서버 종료
        docker-compose stop server-$CURRENT_COLOR
        exit 0
    fi
    sleep 1
done

echo "❌ 배포 실패: 60초 내에 서버가 켜지지 않음"
docker-compose stop server-$TARGET_COLOR
exit 1 # 트래픽 스위칭을 안 했으므로 기존 서버가 계속 정상 서비스됨 (자동 롤백)
Q

Health Check가 실패하면 어떻게 되나요?

A

위 스크립트 마지막 부분처럼, NGINX 설정을 바꾸기 전에 스크립트가 종료됩니다. 즉, 기존에 잘 돌고 있던 Blue 서버가 계속 트래픽을 받게 되므로 사용자는 아무 장애도 느끼지 못합니다(안전한 자동 롤백).

지금 바로 시작해보세요

AI 보안 프롬프트

AI로 보안 점검,
더 스마트하게

AI 탭에서 보안 프롬프트를 실행하고 취약점을 자동으로 찾아보세요