DB
PHP
LLM

S&P 500

SPI@SPX 미국 2026.01.09 16:51 현지시간 기준 |10분 지연제공

6,966.28

전일대비 44.82 (+ 0.65% )

나스닥 종합

NAS@IXIC 미국 2026.01.09 16:15 현지시간 기준 |15분 지연제공

23,671.35

전일대비 191.33 (+ 0.81% )

다우 산업

DJI@DJI 미국 2026.01.09 16:20 현지시간 기준 |15분 지연제공

49,504.07

전일대비 237.96 (+ 0.48% )

CGI, WSGI, ASGI :: FastAPI

작성자아이디 : skok1025, 2023-11-26 10:36:11
카테고리 : 프레임워크 FastAPI 게시글 수정

최근에 사내에서 웹프레임워크로 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