| 구분 | 개발 서버 (Flask dev, Uvicorn dev) | 운영 서버 (WSGI/ASGI) |
|---|---|---|
| 목적 | 빠른 테스트, 디버깅 | 안정적 서비스 제공 |
| 성능 | 단일 스레드, 요청 처리 제한 | 멀티 프로세스/스레드 지원 |
| 보안 | 기본 설정, 보안 기능 부족 | HTTPS, 방화벽, 로깅 등 적용 가능 |
| 장애 대응 | 장애 시 자동 복구 없음 | 프로세스 관리 도구(systemd, supervisor)로 자동 재시작 |
| 확장성 | 부하 분산 불가 | 로드밸런서, 리버스 프록시와 연계 가능 |
gunicorn: 리눅스에서 많이 사용, 멀티 프로세스 지원
waitress: Windows에서도 안정적으로 동작, 멀티 스레드 지원
Flask + waitress 예시
from waitress import serve
from my_flask_app import app # Flask 인스턴스
if __name__ == "__main__":
serve(app, host="0.0.0.0", port=8000)
uvicorn: FastAPI 기본 ASGI 서버, 운영 모드로 실행 가능
hypercorn: uvicorn 대안, HTTP/2 지원
FastAPI + uvicorn 운영 모드 예시
uvicorn my_fastapi_app:app --host 0.0.0.0 --port 8001 --workers 4
--workers 4 : 멀티 프로세스로 동시 요청 처리 성능 향상HTTPS 처리: SSL 인증서 적용
로드밸런싱: 여러 API 서버로 요청 분산
정적 파일 제공: 이미지, JS, CSS 등 빠르게 제공
보안 강화: 포트 숨김, 방화벽 규칙 적용
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/ssl/certs/example.crt;
ssl_certificate_key /etc/ssl/private/example.key;
location /flask {
proxy_pass http://127.0.0.1:8000;
}
location /fastapi {
proxy_pass http://127.0.0.1:8001;
}
}
/flask 요청은 Flask 서버로, /fastapi 요청은 FastAPI 서버로 전달
HTTPS 적용으로 보안 강화
[클라이언트] → [Nginx Reverse Proxy] → [Gunicorn(Flask)]
→ [Uvicorn(FastAPI)]
Nginx가 SSL 처리 및 요청 분배
Flask는 WSGI 서버(gunicorn/waitress)로 실행
FastAPI는 ASGI 서버(uvicorn/hypercorn)로 실행
필요 시 Docker로 각각 컨테이너화하여 관리
Windows 개발 → Linux 운영: 운영 서버는 Linux(Ubuntu, CentOS)에서 Nginx+Gunicorn/Uvicorn 조합이 표준
Docker 사용: 배포 환경을 컨테이너로 만들면 의존성 문제 최소화
모니터링: Prometheus, Grafana로 API 상태 모니터링
자동 재시작: systemd, supervisor로 서버 프로세스 관리