CGI, WSGI, ASGI :: FastAPI
작성자아이디 : skok1025,
2023-11-26 10:36:11
최근에 사내에서 웹프레임워크로 FastAPI 를 채택하여 개발을 진행했는데요. 아무래도 이론적인 지식이 바탕이 된다면 운영에 더 힘이 될 것이라는 생각에FastAPI 프레임워크 관련 블로그 포스팅을 시작해보고자 합니다.
처음 시작은 FastAPI 가 "ASGI 웹프레임워크" 라고 불리는데 이게 무슨의미이고 이와 관련해서 CGI, WSGI 도 함께 알아보고자 합니다.
CGI

- Common Gateway Interface
- 가장 오래된 인터페이스 (= 거의 모든 Web Server 지원)
- Web Server 와 Application 간의 인터페이스
- Web Server 에 HTTP Request 가 오면 Interpeter 에서 이를 감지하여 프로세스를 생성 (fork) 후 처리
- CGI 는 요청마다 프로세스를 생성하는 방식이기 때문에 오버헤드가 심합니다. 이를 해소하기 위해 등장한 것이 FastCGI 입니다.
- FastCGI 는 요청이 들어와도 하나의 프로세스만을 사용하여 처리를 합니다. 즉 메모리에 하나의 프로그램을 적재하여 재활용하기 때문에 CGI 에 비해 오버헤드가 월등하게 감소합니다.
- Tomcat 에서도 FastCGI 를 사용할 수 있다고 합니다.
WSGI

- Web Server Gateway Interface
- Python 어플리케이션, 스크립트가 웹서버와 통신하기 위한 인터페이스
- CGI 는 매 요청마다 프로세스를 생성하지만 WSGI 는 한 프로세스에서 모든요청을 받습니다.
- ㄴ 그럼 FastCGI 처럼 하나의 프로세스를 사용하는건 같은데, 무엇이 다른가 확인해보니 FastCGI 는 다양한 언어 프레임워크에서 사용이 가능하여 범용성을 띄는 반면에 WSGI 는 파이썬 앱만을 위해 고안한 인터페이스라고 합니다.
- 많은 Request 들을 callback 으로 받아 처리합니다.
- 대표적인 두가지 방법
- 1) Nginx, Apache 에서 내장 모듈로 제공하는 server-often high profile 방식
- 1-1) mod-wsgi
- 1-2) mod-python
- 2) Python 으로 작성된 Web App Server
- 2-1) gunicorn
- 2-2) cherrpy
- WSGI 는 동기함수만 지원하여 여러작업을 동시에 처리하는데 한계가 있습니다. 그리고 아래와 같은 기능을 제공하지 않습니다.
- Web Socket 지원 안함
- ㄴ 어떻게 하면 가능은 하다는데 공식적인 방법은 아닌듯함.
- HTTP 2.0 지원 안함
ASGI

- Asynchronous Server Gateway Interface
- 대용량 트래픽을 더욱 더 유연하게 처리하기 위해서 등장한 인터페이스입니다.
- WSGI 가 Synchronuous 하게 동작함으로써 발생하는 한계를 해결하기 위해 Uvicorn 과 같은 ASGI 가 나오게 되었습니다. (* uvloop 를 이용하여 요청을 Asynchronous 하게 처리할 수 있다고함)
- Web Socket, HTTP 2.0 을 지원합니다.
- 현재 사내에서 서버를 시작할 때, 위 그림과 같이 gunicorn 을 process manager 로 uvicorn 으로 worker process 를 3개를 띄워 실행하고 있습니다.
- gunicorn main:app --workers 3 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80
- uvicorn 만으로도 worker 여러 프로세스를 띄울 수는 있지만 공식문서에서도 gunicorn 을 process manager 로 worker process 를 띄우는게 더 효율적이라고 합니다.
- worker 와 관련한 내용은 https://fastapi.tiangolo.com/deployment/server-workers/ 를 참고해주세요.
해당 블로그를 작성하면서 참고했던 포스팅들의 링크를 남겨두겠습니다. 학습에 도움이 되시기를...
end