FastAPI와 Docker를 사용해 애플리케이션을 운영할 때, 안정성과 가용성을 높이기 위해 이중화와 무중단 배포가 필요합니다. 이 글에서는 Blue-Green Deployment와 NGINX 로드 밸런싱을 통해 FastAPI 애플리케이션을 이중화하고 무중단 배포하는 방법을 설명합니다.
1. 이중화와 무중단 배포란?
이중화는 동일한 애플리케이션을 여러 인스턴스로 실행해 트래픽을 분산 처리하고, 한쪽 인스턴스에 문제가 생기더라도 다른 인스턴스로 서비스를 계속 제공하는 방식입니다.
무중단 배포는 서비스 중단 없이 새로운 소스를 운영 환경에 반영하는 배포 방법으로, 사용자가 배포 중에도 서비스를 끊김 없이 이용할 수 있도록 합니다.
2. Blue-Green Deployment와 로드 밸런싱
Blue-Green Deployment는 현재 운영 중인 환경(Blue)과 새로운 소스를 반영한 테스트 환경(Green)을 번갈아가며 사용하는 배포 방식입니다. 이 방식에 NGINX와 Docker Compose를 활용하면 두 개의 환경을 동시에 실행해 트래픽을 분산 처리하는 이중화를 구현할 수 있습니다.
3. 환경 구성
3.1 디렉터리 구조
다음과 같은 디렉터리 구조를 사용합니다:
coconut-engine/
├── app/
│ ├── main.py # FastAPI 애플리케이션
│ ├── requirements.txt # Python 패키지 의존성
├── Dockerfile # Docker 이미지 빌드 설정
├── docker-compose.yml # Docker Compose 설정
├── nginx.conf # NGINX 로드 밸런서 설정
3.2 Dockerfile 작성
Dockerfile은 FastAPI 애플리케이션을 컨테이너화하기 위한 설정 파일입니다.
FROM python:3.9-slim
# 작업 디렉토리 설정
WORKDIR /app
# 필요한 파일 복사
COPY ./app /app
COPY ./requirements.txt /app
# 의존성 설치
RUN pip install --no-cache-dir --upgrade pip && \
pip install --no-cache-dir -r requirements.txt
# FastAPI 실행
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
3.3 NGINX 설정 작성
nginx.conf 파일을 작성해 NGINX가 트래픽을 Blue와 Green 환경으로 분산 처리하도록 설정합니다.
events {}
http {
upstream fastapi_backend {
server fastapi-blue:8000; # Blue 환경
server fastapi-green:8000; # Green 환경
}
server {
listen 80;
location / {
proxy_pass http://fastapi_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
3.4 Docker Compose 설정 작성
docker-compose.yml 파일을 작성해 두 개의 FastAPI 컨테이너(Blue, Green)와 NGINX를 실행합니다.
version: "3.9"
services:
fastapi-blue:
build:
context: .
container_name: fastapi-blue
ports:
- "8001:8000"
fastapi-green:
build:
context: .
container_name: fastapi-green
ports:
- "8002:8000"
nginx:
image: nginx:latest
container_name: nginx
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- fastapi-blue
- fastapi-green
4. 이중화 및 무중단 배포 구현
4.1 Blue와 Green 환경 동시 실행
Blue와 Green 환경을 동시에 실행하여 이중화를 구성합니다:
docker-compose up -d
이 명령은 Blue와 Green 환경을 모두 실행하고 NGINX가 두 환경으로 트래픽을 분산합니다.
4.2 서비스 무중단 배포
새로운 코드를 반영하려면 한쪽 환경씩 순차적으로 업데이트합니다:
- Green 환경 업데이트:
- 새로운 코드를 빌드하고 Green 환경을 업데이트합니다:
- docker-compose build fastapi-green
- docker-compose up -d fastapi-green
- Green 환경 상태 확인:
- Green 또는 Blue 환경이 정상 작동하는지 확인합니다:
- curl http://<YOUR_PUBLIC_IP>
- Blue 환경 업데이트:
- 동일한 방식으로 Blue 환경을 업데이트합니다:
- docker-compose build fastapi-blue
- docker-compose up -d fastapi-blue
5. 트래픽 분산 방식
NGINX는 기본적으로 라운드 로빈(Round Robin) 방식을 사용해 요청을 Blue와 Green 환경으로 번갈아가며 전달합니다. 필요에 따라 다른 방식으로 설정할 수 있습니다:
가중치 기반 분산
Blue와 Green 환경에 트래픽 비율을 다르게 설정합니다:
upstream fastapi_backend {
server fastapi-blue:8000 weight=2; # Blue에 2배의 트래픽 전달
server fastapi-green:8000 weight=1;
}
IP 해시 기반 분산
사용자 IP를 기준으로 요청을 특정 환경에 고정 분배합니다:
upstream fastapi_backend {
ip_hash;
server fastapi-blue:8000;
server fastapi-green:8000;
}
6. 안정성 강화를 위한 추가 설정
헬스 체크 추가
컨테이너 상태를 주기적으로 확인하기 위해 헬스 체크를 추가합니다:
docker-compose.yml:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
NGINX 헬스 체크 설정
NGINX에서도 애플리케이션 상태를 확인할 수 있습니다:
server {
location /health {
proxy_pass http://fastapi_backend/health;
}
}
7. 결론
이 구성을 통해 Docker 기반 FastAPI 애플리케이션의 이중화와 무중단 배포를 구현할 수 있습니다. 이를 통해:
- 서비스 안정성이 높아지고,
- 배포 중단 없이 새로운 코드 반영이 가능합니다.