Gunicorn/Uvicorn과 Nginx를 활용한 실서버 배포 아키텍처
Django 애플리케이션을 실제 서비스 환경에 배포하기 위한 표준 아키텍처로, Nginx가 클라이언트 요청을 받아 정적 파일은 직접 처리하고 동적 요청은 Gunicorn/Uvicorn으로 전달하는 구조
왜 이 조합을 사용하는가
개발용 runserver의 한계
단일 스레드로 동작하여 동시 접속 처리 불가
보안과 성능을 고려하지 않은 개발용 서버
각 컴포넌트의 역할 분담
Nginx (Web Server): 클라이언트 요청 수신, 정적 파일 서빙, 리버스 프록시, SSL/TLS 처리
Gunicorn (WSGI Server): Django 애플리케이션 실행 및 프로세스 관리
Uvicorn (ASGI Server): 비동기 처리 지원, Gunicorn과 결합하여 사용
WSGI vs ASGI 선택 기준
비동기 기능 사용 시:
async def뷰, Django Channels, StreamingHttpResponse 등이 있다면 ASGI 필수현재 표준:
Gunicorn + Uvicorn Worker조합이 현대적 선택
배포 설정 과정
1. Gunicorn/Uvicorn 설치 및 실행
pip install gunicorn uvicorn
gunicorn --bind unix:/run/gunicorn.sock --workers 3 -k uvicorn.workers.UvicornWorker myproject.asgi:application2. Systemd 서비스 등록
/etc/systemd/system/gunicorn.service파일 생성서버 재부팅 시 자동 실행 및 장애 시 재시작 보장
3. Nginx 리버스 프록시 설정
/etc/nginx/sites-available/myproject설정 파일 생성정적 파일(
/static/,/media/)은 Nginx가 직접 처리동적 요청은 Gunicorn 소켓으로 전달
실무 운영 팁
워커 개수 산정
시작점:
(2 × CPU 코어 개수) + 1부하 테스트와 모니터링을 통해 최적값 도출
무중단 배포
Gunicorn의 Graceful Restart 기능 활용
sudo systemctl reload gunicorn으로 점진적 워커 교체
보안 강화
Nginx에서 보안 헤더 설정
Unix 소켓 사용으로 내부 통신 보안 향상
정적 파일 처리
collectstatic명령으로 정적 파일 수집Nginx가 직접 서빙하여 Django 서버 부하 감소
Last updated
