Python Web Framework들은 Web Server와 효율적으로 통신하기 위해 잘 정의된 인터페이스가 필수적이다.
해당 Interface는 CGI => WSGI => ASGI 순으로 발전 해 왔으며 최근 파이썬 프레임워크 들은 ASGI를 지원한다.
Web Server란?
- Webserver는 하드웨어 적인 의미와 소프트웨어 적인 의미를 함께 가지고 있으며 Client의 요청을 최초 수신하여 Web Applicaton 과 상호 소통 하고, Response를 전달해주는 역할을 한다.
- 대표적으로는 Apache HTTP Server와 Nginx가 있다.
CGI (Common Gateway Interface ~2003)
- 서버와 웹 애플리케이션 간에 데이터 교환에 대한 표준 컨벤션
- CGI 동작 순서
1) Web Server가 Client로 부터 HTTP Request를 수신
2) Request 정보 (HTTP Method, URL, Parameters)를 환경변수 & Standard Input으로 전달
3) 내용 전달시 Script를 실행하고, 해당 Script는 비즈니스 로직 수행 후 Standard Output 반환
4) Output은 Web Server에게 전달 및 Clinet에게 최종 반환 - 단점 : Request 수신 시마다 Apllication 프로세스를 다시 실행하여, 메모리 적재 시간 소요 등의 문제 발생 (다량의 요청이 들어올 시 매우 비효율적) / 즉 CGI는 요청시마다 프로세스를 생성하여 커널 리소스 사용, 반납
WSGI (Web Server Gateway Interface 2003~)
- 기본적으로 Web Server와 Web Application 간의 중간 역할 (+ 미들웨어 역할)
- WSGI를 구현하는 Web Server와 Application을 WSGI Compatible 하다고 하며, WSGI Application이라고 부르기도 함
- Request 정보 (HTTP Method, URL, Parameters, URI, DATA)를 환경 변수/Callback/함수/객체로 Application에 전달
- WSGI Middleware (ex. uWSGI, Gunicorn, Werkzeug, Bjoern, CheeryPy)
1) 서비스 개발시 Authentication, Routing, Session, Cookie, Error Page 등 공통적으로 필요한 기능 수행
2) +독자적으로 WSGI Server 역할 수행도 가능 - WSGI의 한계
1) 동기 호출 방식이라, 길게 유지되어야 하는 연결(웹 소켓) / 긴 대기시간을 가지는 HTTP 연결 등에 적합 X
2) 파이썬 비동기 (asyncio, await, coroutine) 사용 불가 (비동기 큐 cerely 등을 활용하여 서비스 구현은 가능하지만 기본적인 구현이나 유지보수 등이 쉽지 않음)
3) 초HTTP/2 (Concurrency) 동시성 적용 불가
ASGI (Asynchronous Server Gateway Interface)
- WSGI (동기적) 만으로는 대용량 트래픽 처리를 유연하게 하기에는 한계 존재
- ASGI는 기존의 WSGI 한계 보완 (WebSocket 가능, HTTP/2, HTTP 프로토콜 처리 가능)
- ASGI는 WSGI의 상위 집합 개념으로 설계되어 asgiref 라이브러리를 사용해 WSGI를 ASGI 내에서 실행 가능
- Send, Receive 함수를 제공하여 해당 함수를 비동기적으로 호출하며 이벤트를 처리
- 주요 라이브러리 (Daphne, Uvicorn, Django-channel, Quart, Starlette 등) 이 존재
참고 문헌
- https://blog.neonkid.xyz/249
- https://brownbears.tistory.com/505
- https://sgc109.github.io/2020/08/15/python-wsgi/
'Python > Deployment' 카테고리의 다른 글
[배포] Python WSGI 배포 서버 종류 (Gunicorn, uWSGI) (0) | 2023.07.08 |
---|---|
[배포] Python ASGI 배포 서버 종류 비교 (0) | 2023.06.06 |
[웹서버] WebServer와 WAS 차이 (0) | 2022.08.23 |