ASGI

서버와 파이썬 프로그램의 입구 역활을 하는 것이 WSGI 혹은 ASGI

ASGI는 애플리케이션 프로그램(FastAPI)의 실행 결과를 웹 서버에 전달해주며, 웹 서버는 ASGI로부터 전달받은 응답 결과를 웹 클라이언트(브라우저)에 전송한다

Untitled

1) Web Server

웹서버의 역할은 두개로 나누어 볼 수 있다. 정적인 요청의 서빙이나 Reverse Proxy를 이용하여 어플리케이션 서버로 동적인 요청을 전달하는 용도이다. (로드밸런싱의 역할도 가능하겠다.) Apache 나 Nginx 는 워낙 유명하고 근래에는 Go 로 개발된 Caddy라는 서버도 드물게 쓰는 모양이다. Python 이 아닌 다른 환경의 웹서버와 FastCGI 서버와의 연결이 그러하듯 웹서버와 TCP 로 확장하거나 Unix Socket 으로 연결하여 성능을 높이기도 한다.

2) WSGI 와 ASGI

Python 의 경우에도 어플리케이션 서버와의 통신을 위해 Gateway Interface 가 존재하고 있고 초기에 나온 웹 어플리케이션과의 인터페이스가 WSGI (Web Server Gateway Interface)이다. 그러면 ASGI(Asynchronous Server Gateway Interface) 는 무엇일까? ASGI 문서에 다음과 같이 WSGI 와 ASGI에 대해 설명하고 있다.

ASGI( Asynchronous Server Gateway Interface )는 WSGI의 정신적 계승자로, 비동기 가능 Python 웹 서버, 프레임워크 및 애플리케이션 간의 표준 인터페이스를 제공하기 위한 것입니다. WSGI가 동기 Python 앱에 대한 표준을 제공했다면 ASGI는 WSGI 이전 버전과의 호환성 구현과 여러 서버 및 애플리케이션 프레임워크를 통해 비동기 및 동기 앱 모두에 대한 표준을 제공합니다.

Uvicorn

Uvicorn is a lightning-fast ASGI server implementation, using uvloop and httptools. uvloop, httptools 를 사용하는 ASGI 웹 서버 (프로세스 관리자, 실행기)

<aside> 💡 gunicorn(WSGI) 과 uvicorn(ASGI) 을 같이 사용하고 있는데 왜 그럴까?

</aside>

여기서 gunicorn은 프로세스 매니저로서 동작하게 된다. 프로세스 매니저로서 Master 프로세스를 띄우고 Worker 프로세스로, 단일 프로세스로 실행하는 uvicorn  (uvicorn 에는 Gunicorn-호환 worker class 가 존재한다) 프로세스를 여러 개 미리 띄워 요청을 처리하는 구조이다.

3) Application Framework

파이썬에도 여러가지 프레임워크가 존재 하고 있고 용도가 Full Stack (Django 등) 인지 LightWeight (Flask, bottle 등) 인지 그리고 오로지 API 만을 위한 것 (FastAPI, falcon 등) 인지에 따라 원하는 프레임워크를 선택하면 되겠다.