🔹 Gunicorn으로 Django를 실행하는 이유
Django 프로젝트를 운영 환경(Production)에서 배포할 때, Gunicorn을 사용하면 성능과 안정성을 높일 수 있습니다.
Gunicorn을 사용하는 이유를 정리하면 다음과 같습니다.
1. 운영 환경에서 Django의 기본 개발 서버(runserver)는 적합하지 않음
Django의 기본 개발 서버(python manage.py runserver)는 개발용으로 설계되어 있습니다.
🚨 운영 환경(Production)에서는 적합하지 않습니다!
- 단일 스레드로 동작 → 동시 요청을 잘 처리하지 못함
- 자동 리로드 기능이 있어 메모리 낭비가 발생할 수 있음
- 보안 취약점이 있을 가능성이 높음
따라서 운영 환경에서는 Gunicorn 같은 WSGI 서버가 필요합니다.
2. Gunicorn은 WSGI(Web Server Gateway Interface) 서버이다
Gunicorn(Green Unicorn)은 WSGI 서버로, Django와 같은 Python 웹 애플리케이션을 실행할 수 있도록 도와줍니다.
🚀 Gunicorn이 하는 역할
- 클라이언트(사용자) → 웹 서버(Nginx) → Gunicorn → Django
- Gunicorn이 Django 애플리케이션을 실행하고 요청을 처리
- WSGI 인터페이스를 사용하여 Django의 응답을 웹 서버(Nginx)로 전달
즉, Gunicorn은 Django와 Nginx(Apache) 사이에서 작동하는 미들웨어 역할을 합니다.
3. Gunicorn을 사용하면 Django가 동시 요청을 더 잘 처리
Gunicorn은 멀티 프로세스(multiprocessing) 방식을 사용하여 여러 개의 요청을 동시에 처리할 수 있습니다.
💡 runserver (기본 개발 서버)와 비교
서버 동시 요청 처리 운영 환경 적합성 성능 최적화 가능 여부
runserver | ❌ (싱글 스레드, 개발용) | ❌ (운영 환경 부적합) | ❌ |
Gunicorn | ✅ (멀티 프로세스 지원) | ✅ (운영 환경 추천) | ✅ (Worker 개수 조정 가능) |
Gunicorn은 여러 개의 Worker를 실행하여 요청을 병렬로 처리하므로 성능이 향상됩니다.
예를 들어, workers=4로 설정하면 4개의 요청을 동시에 처리 가능합니다.
4. Nginx와 함께 사용하여 트래픽을 효율적으로 처리
Gunicorn은 단독으로 실행할 수도 있지만, Nginx와 함께 사용하면 더욱 안정적입니다.
💡 Gunicorn + Nginx 구조
사용자 → Nginx(정적 파일 처리) → Gunicorn(WSGI 요청 처리) → Django
✔ Gunicorn이 Django 애플리케이션을 실행하고 요청을 처리
✔ Nginx가 정적 파일(css, js, images)을 빠르게 제공
✔ Nginx가 요청을 Gunicorn에 전달하고, 결과를 사용자에게 반환
👉 결과: 속도가 빨라지고, 트래픽을 효과적으로 분산할 수 있음.
5. Gunicorn은 간단하고 설정이 쉬움
Gunicorn을 실행하는 방법은 매우 간단합니다.
📌 Gunicorn 설치
pip install gunicorn
📌 Gunicorn으로 Django 실행
gunicorn --workers 4 --bind 0.0.0.0:8000 myproject.wsgi:application
- --workers 4 → 4개의 Worker 프로세스 실행
- --bind 0.0.0.0:8000 → 모든 IP에서 8000번 포트로 요청 받음
- myproject.wsgi:application → Django 프로젝트의 WSGI 애플리케이션 실행
🚀 Gunicorn을 systemd로 등록하면 자동으로 실행되도록 설정할 수도 있음.
6. Gunicorn은 성능 튜닝이 가능함
Gunicorn은 다양한 옵션을 제공하여 성능을 최적화할 수 있습니다.
🔹 Worker 개수 조정 (--workers)
gunicorn --workers 4 myproject.wsgi:application
💡 일반적으로 CPU 코어 수 × 2 + 1 개수 추천
예: 4코어 CPU → workers=9 설정
🔹 Timeout 설정 (--timeout)
gunicorn --timeout 30 myproject.wsgi:application
💡 요청이 너무 오래 걸리는 경우 Gunicorn이 자동으로 종료
🔹 Django를 백그라운드에서 실행 (--daemon)
gunicorn --daemon --workers 4 myproject.wsgi:application
💡 Gunicorn을 백그라운드에서 실행하고 서버가 종료되지 않도록 유지
🚀 결론
✅ Gunicorn을 사용하는 이유
1️⃣ Django의 기본 개발 서버(runserver)는 운영 환경에서 적합하지 않음
2️⃣ Gunicorn은 WSGI 서버로, Django 애플리케이션을 안정적으로 실행할 수 있음
3️⃣ 멀티 프로세스 지원으로 동시에 많은 요청을 처리 가능
4️⃣ Nginx와 함께 사용하면 성능과 보안이 향상됨
5️⃣ 설정이 간단하고 성능 최적화가 가능함
💡 운영 환경에서는 runserver 대신 Gunicorn + Nginx 조합을 강력 추천합니다! 🚀