CGI, WCGI, ASGI는 어플리케이션 게이트웨이, 또는 서버 인터페이스라고 볼 수 있습니다.
JAVA 진영의 Tomcat과 비슷한 역할을 하고 있습니다.
위와같이 대부분의 (CGI, WCGI, ASGI)서버는 Nginx와 같이 쓰입니다. 클라이언트가 www.django.com 주소를 입력하면 DNS서버에서 IP를 얻어와 서버로 접속을 합니다. 서버에서 제일 처음 Nginx를 만나고, Nginx는 client가 static(정적)인 자료를 요청한다면 Nginx에서 바로 Client에게 정적인 자료를 Return합니다. 만약 동적인 요청이 들어왔을경우 Gunicorn에게 요청을 보내서 HTTP요청을 Python코드로 변환해 Django서버에게 요청을하고, Django는 이에 맞는 응답을 하게됩니다.
파이썬 어플리케이션의 경우 요청을 python 코드로 변환하는 과정이 필요하고, 웹서버와 HTTP통신간의 인터페이스를 일치시켜야 하기때문에 이 서버를 반드시 사용하고 있습니다. django에서는 gunicorn을, fastapi에서는 uvicorn을 사용하고 있습니다. 우선 CGI, WCGI, ASGI가 무엇인지 알아보겠습니다.
CGI(Common Gateway Interface)
CGI는 가장초기에 나온 웹 서버와 애플리케이션 간의 데이터를 주고받는 가장 초기의 표준 인터페이스 입니다.
아파치 웹 서버가 요청을 받을 때마다 별도의 프로세스를 만들어 Python 스크립트를 실행하는데, 느리고 리소스가 많이 필요해서 현대 웹 개발에는 거의 사용되지 않습니다.
WSGI (Web Server Gateway Interface)
WSGI는 Python 웹 애플리케이션과 웹 서버 간의 통신을 위한 표준 인터페이스입니다.
WSGI는 CGI의 단점을 극복하기 위해 설계되었습니다. CGI와 달리, 요청을 처리할 때마다 새로운 프로세스를 생성하지 않고, 애플리케이션을 로드한 상태에서 요청을 처리하기 때문에 훨씬 효율적입니다.
WSGI의 역할은 간단히 말해, 웹 서버와 Python 애플리케이션 간의 중계자 역할을 하는 것입니다.
Python 웹 프레임워크(Django, Flask 등)는 WSGI를 통해 웹 서버(예: Gunicorn, uWSGI)와 통신하며, 동적인 요청에 응답할 수 있게 됩니다.
Gunicorn은 대표적인 WSGI 서버로, Python 애플리케이션과 Nginx 같은 웹 서버 간의 연결을 처리합니다.
ASGI (Asynchronous Server Gateway Interface)
ASGI는 WSGI의 한계를 극복하고, 비동기 통신을 지원하기 위해 설계된 인터페이스입니다.
현대 웹 애플리케이션에서는 WebSocket, HTTP/2 등 비동기 통신을 지원해야 하는 경우가 많아졌습니다.
하지만 WSGI는 동기 방식으로 설계되어 비동기 처리를 지원하지 못했습니다.
ASGI는 이러한 문제를 해결하며, Django, FastAPI 같은 최신 Python 웹 프레임워크에서 WebSocket, 장기 실행 작업, 비동기 요청 등을 처리할 수 있게 합니다.
FastAPI는 ASGI 서버인 Uvicorn을 사용하여 비동기 요청과 응답을 처리합니다.