웹 개발/Backend

[Python] 애플리케이션 서버 gunicorn

devsean 2025. 6. 15. 12:24

gunicorn?

Python 애플리케이션 서버로, Python 웹 애플리케이션을 실행할 수 있는 WSGI(Web Server Gateway Interface) 표준을 따라 구현된 구현체이다. 즉 WSGI 서버이며, Web Server인 Nginx나 Apache HTTP Server와 붙여서 같이 사용할 수 있다. 단순성과 성능에 초점을 두고 있다. django, flask와 같은 Python 웹 프레임워크를 지원하며, Uvicorn worker를 활용하게 되면 ASGI(Asynchronous Server Gateway Interface) 표준을 따르며 FastAPI도 지원한다.

 

Master-Worker 패턴

gunicorn은 Master-Worker 패턴을 따른다. 애플리케이션 서버를 시작하면, gunicorn은 먼저 Master 프로세스를 생성한다. Master 프로세스는 전체 서버의 상태를 관리하고, Worker 프로세스들을 생성, 종료 및 재시작한다. Worker 프로세스는 각기 독립적으로 Master로부터 클라이언트 요청을 전달받아 처리한다. 즉 Master가 Worker에게 작업을 할당하고 관리하는 형태를 가지는 것이다.

 

Master-Worker 패턴을 채택함으로써 서버의 안정성(여러 Worker들에게 작업을 할당하여 하나의 Worker가 죽어도 다른 Worker가 살아있음)을 높일 수 있고, 성능이 향상(병렬 처리 가능)된다. 또한 Master가 Worker를 관리하므로 관리 효율성이 높으며, Worker 수를 조절하여 시스템 자원에 맞춰 확장할 수 있다. 분산 처리자동 복구라는 관점에서, Kubernetes의 구조와 유사하다.

 

멀티 프로세싱

Python은 CPU-Bound 작업을 수행할 때, GIL(Global Interpreter Lock)의 영향을 받아 한 개의 스레드만 사용할 수 있다. CPU-Bound 작업의 예시로는 과학 연구나 분석 등에서 사용되는 수학적 계산, 암/복호화 작업, 이미지/영상 처리작업, ML 작업 등이 있다. 이 때 gunicorn을 채택하여 멀티 프로세스를 돌리게 되면, 이러한 문제를 해결할 수 있다. 일반적으로 한 개의 CPU에 4개의 worker를 권장한다.

 

커맨드

다음과 같이 간편하게 웹 서버를 기동할 수 있다.

# -k : 실행할 워커 클래스(sync가 기본값이며, 비동기 서버라면 uvicorn.workers.UvicornWorker)
# --access-logfile : 액세스 로그 출력 파일(- 이면 콘솔 출력)
# --bind : 기동할 주소(Hosting IP : Port)
# --workers : worker 갯수
# 마지막에 명시할 내용 [파일명]:[App 객체 명]
gunicorn -k sync --workers 1 --bind 0.0.0.0:5001 --access-logfile - main:app

 

참고자료

Gunicorn - Python WSGI HTTP Server for UNIX

[Python][Backend][Flask] Gunicorn Worker는 도대체 몇 개를 설정해야 하는 거야? - Gunicorn에 대한 고찰

[Python] Python의 GIL과 멀티스레딩 - 1