관련 정리 글
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의 작동 원리는 아래 블로그에 굉장히 자세하게 나와있다.
위 블로그 내용을 간단히 요약하면 다음과 같습니다.
- 1. gunicorn은 prefork 방식으로 다수의 자식 프로세스를 띄워 놓고 이들이 http 요청을 처리하게 됨
- 2. (1) 요청을 처리하려면 process마다 ip와 port가 각각 있어야 되고, (2) 분배 역할을 누군가 수행해 주어야 함
- 3. (1) 의 경우 소켓을 통해서 해결되며, 부모 프로세스가 가진 서버 소켓 정보는 자식 소켓들이 복사해서 가지고 있기 때문에 이를 통해 클라이언트와 통신을 주고 받기가 가능
- 4. (2) 의 경우 동시에 몰려오는 다수의 요청들이 쌓인 요청 대기 큐에서, 자식 프로세스 각각이 가지고 있는 서버 소켓으로 요청 정보를 처리
- 5. 자식 프로세스 간 경합에 대한 우려는 자식 프로세스가 운영체제 커널에 의해 관리되기 때문에, 여러명의 자식 프로세스가 요청 대기 큐에 대해 동시에 요청해도, 1개의 자식 프로세스만 큐에 접근 가능하고 나머지는 자동으로 block 상태가 됨.
🎈 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 |