Python/Deployment

[배포] CGI vs ASGI vs WSGI 비교

yubi5050 2022. 7. 15. 10:37

 

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는 요청시마다 프로세스를 생성하여 커널 리소스 사용, 반납

 

이미지 출처 : https://blog.neonkid.xyz/249

 

 

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 등) 이 존재

 

 

참고 문헌