Python/Deployment

[배포] Python WSGI 배포 서버 종류 (Gunicorn, uWSGI)

yubi5050 2023. 7. 8. 14:02

관련 정리 글

https://yubi5050.tistory.com/153 // [웹서버] WebServer와 WAS 차이

https://yubi5050.tistory.com/114 // [웹서버] CGI vs ASGI vs WSGI 비교

https://yubi5050.tistory.com/109 // [Django, AWS] EC2 에서 Nginx + Gunicorn + Django 배포하기

 

이전 글 요약

  • WebServer는 WAS의 부하를 줄이며, WAS(Gunicorn, Uvicorn, uWSGI)과 같은 서버를 통해 Web Application 배포
  • ASGI, WSGI 등은 CGI (Common Gateway Interface)의 일종으로 여러 언어들의 다양한 요청을 이해할 수 있도록 공통된 규칙으로 변환하는 역할을 수행하며 CGI => WSGI => ASGI 순으로 발전해왔다.

 

1. WSGI, ASGI

🎈 WSGI (Web Server Gateway Interface)

  • Request 정보(Header, Method, URL, Parameters, Data)를 환경 변수로 전달.
  • 웹 어플리케이션이 요청을 처리하고 Callback 함수로 응답
  • 미들웨어 역할로 서비스 개발 간 Authentication, Routing, Session, Cookie, Error Page 등 공통 필요 기능 수행

 

WSGI의 한계

  • 1) 동기 호출 방식으로, 길게 유지되어야 하는 연결(웹 소켓) / 긴 대기시간을 가지는 HTTP 연결 등에 부적합
  • 2) 파이썬 비동기 (asyncio, await, coroutine) 사용 불가 (비동기 큐 cerely 등을 활용하여 서비스 구현은 가능하지만 기본적인 구현이나 유지보수 등이 쉽지 않음)

 

🎈 ASGI (Asynchronous Server Gateway Interface)

  • ASGI는 WSGI의 상위 집합 개념으로 설계되어 asgiref 라이브러리를 사용해 구현
  • ASGI는 기존의 WSGI 한계 보완 (WebSocket 가능, HTTP/2, HTTP 프로토콜 처리 가능) 백그라운드 코루틴 활용 가능
  • Send, Receive 함수를 제공 => 해당 함수를 비동기적으로 호출하며 이벤트를 처리

 


 

2. Gunicorn 이란?

  • Gunicorn "Green Unicorn" 으로 Python WSGI(Web Server Gateway Interface, 파이썬의 WAS) HTTP Server로 Ruby의 Unicorn 프로젝트에서 이식된 prefork 방식의 웹 서버
  • prefork 방식 : http 요청을 처리하기 위해 미리 자식 프로세스를 여러개 띄워서 동시에 처리하는 방식.
  • Gunicorn 사용시 django 프레임워크를 사용하는 다수의 자식 프로세스가 동시에 띄워짐

 

🎈  Gunicorn 작동 원리

Gunicorn의 작동 원리는 아래 블로그에 굉장히 자세하게 나와있다.

https://psyhm.tistory.com/51

 

prefork 기반 웹서버가 요청을 동시에 처리할 수 있는 이유

서론 제가 현재 재직 중인 회사에서는 웹 어플리케이션 서버를 개발하기 위해 Django 스택을 사용하고 있습니다. Django는 Web Server가 아니고 Web framework이기 때문에 django를 단순히 python으로 실행한

psyhm.tistory.com

 

위 블로그 내용을 간단히 요약하면 다음과 같습니다.

  • 1. gunicorn은 prefork 방식으로 다수의 자식 프로세스를 띄워 놓고 이들이 http 요청을 처리하게 됨
  • 2. (1) 요청을 처리하려면 process마다 ip와 port가 각각 있어야 되고, (2) 분배 역할을 누군가 수행해 주어야 함
  • 3. (1) 의 경우 소켓을 통해서 해결되며, 부모 프로세스가 가진 서버 소켓 정보는 자식 소켓들이 복사해서 가지고 있기 때문에 이를 통해 클라이언트와 통신을 주고 받기가 가능
  • 4. (2) 의 경우 동시에 몰려오는 다수의 요청들이 쌓인 요청 대기 큐에서, 자식 프로세스 각각이 가지고 있는 서버 소켓으로  요청 정보를 처리
  • 5. 자식 프로세스 간 경합에 대한 우려는 자식 프로세스가 운영체제 커널에 의해 관리되기 때문에, 여러명의 자식 프로세스가 요청 대기 큐에 대해 동시에 요청해도, 1개의 자식 프로세스만 큐에 접근 가능하고 나머지는 자동으로 block 상태가 됨.

출처 : https://psyhm.tistory.com/51

 

🎈  Gunicorn 추가 정리 내용

  • (추가) 위의 각자의 worker (자식 프로세스)들은 동일한 애플리케이션 코드를 복제하여 가지고 있으며, 독립적인 메모리 공간에서 개별로 요청을 처리한다.
  • 외부 리소스 (DB나 캐싱)등을 사용할 때는 여러 프로세스가 동시 접근 할 수 있음에 대한 고려가 필요하며, 동시성과 상태 관리에 대한 적절한 설계도 고려해야 함
  • Gunicorn worker들은 독립적인 WSGI 서버 역할을 수행하면서, 멀티 스레딩으로 여러 요청을 처리함. 각 worker 프로세스에 요청이 오면, wsgi 어플리케이션으로 전달하고, 애플리케이션은 요청 처리하기 위해 여러 스레드를 생성해 동시에 처리

 


 

3. uWSGI 란?

WSGI Server 중 하나로, gunicorn과 마찬가지로 prefork 방식과 유사한 동작 방식을 가짐

Gunicorn에 비해 성능이 다소 적다고 하며 (자원 소모(ram과 cpu 사용)가 비교적 많다고 함)

'Python > Deployment' 카테고리의 다른 글

[배포] Python ASGI 배포 서버 종류 비교  (0) 2023.06.06
[웹서버] WebServer와 WAS 차이  (0) 2022.08.23
[배포] CGI vs ASGI vs WSGI 비교  (0) 2022.07.15