본문 바로가기

웹 프레임워크/FastAPI

FastAPI - 21 (Gunicorn)

Gunicorn이 뭔가요? 왜 설치 해야 하나요? FastAPI는 uvicorn으로 실행하는데 Gunicorn과 같이 실행 할 수 있나요?
Gunicorn을 설치 하면서 위와 같은 의문이 많이 들었습니다. 제가 설치한 내용을 간단히 정리 했습니다.

 

공식 사이트
Gunicorn: https://gunicorn.org/
uvicorn: https://www.uvicorn.org/

Gunicorn? uvicorn?

Uvicorn과 Gunicorn은 둘 다 Python 웹 애플리케이션을 위한 서버입니다. 다만 지원하는 인터페이스와 내부 작동 방식에 차이가 있습니다.

Gunicorn

  • 인터페이스: Gunicorn은 WSGI(Web Server Gateway Interface) 애플리케이션 서버입니다. WSGI는 Python에서 오래 전부터 사용되어 온 웹 서버와 애플리케이션 간의 표준 인터페이스입니다.
  • 언어 및 프레임워크: 주로 Django, Flask와 같은 전통적인 Python 웹 프레임워크와 함께 사용됩니다.
  • 작동 방식: Gunicorn은 동기적 방식으로 작동하며, 여러 워커 프로세스를 생성하여 동시 요청을 처리합니다. 각 워커는 하나의 요청을 동시에 처리할 수 있습니다.

Uvicorn

  • 인터페이스: Uvicorn은 ASGI(Asynchronous Server Gateway Interface) 애플리케이션 서버입니다. ASGI는 WSGI의 비동기 버전으로, 비동기 Python 프로그래밍을 지원합니다.
  • 언어 및 프레임워크: FastAPI, Starlette 같은 비동기 Python 웹 프레임워크와 함께 사용됩니다.
  • 작동 방식: Uvicorn은 비동기적 방식으로 작동하며, 이는 I/O 바운드 작업과 높은 동시성 요구 사항을 가진 애플리케이션에 적합합니다. 단일 Uvicorn 워커는 여러 비동기 요청을 동시에 처리할 수 있습니다.

왜 Gunicorn을 함께 사용하나요?

Uvicorn으로 비동기적 처리를 하는 경우에도 Gunicorn을 함께 사용하는 것은 Gunicorn의 안정성과 관리 기능을 활용하기 위해서입니다.

  • 안정성 및 프로세스 관리: Gunicorn은 매우 안정적인 멀티-프로세스 웹 서버로, 각 워커 프로세스의 관리와 로드 밸런싱에 탁월합니다.
  • 워커 모델의 활용: Uvicorn을 Gunicorn의 워커로 사용하면, 비동기 웹 애플리케이션을 실행하는 동시에 Gunicorn의 관리 기능을 활용할 수 있습니다.
  • 보다 나은 성능과 안정성: Gunicorn은 여러 워커 프로세스를 통해 애플리케이션의 부하를 분산시킬 수 있으며, 이는 고성능과 높은 가용성을 제공합니다. Uvicorn 워커를 사용하면 Gunicorn의 이러한 장점과 함께 비동기 처리의 효율성을 누릴 수 있습니다.

설치(ubuntu 20.04)

pip를 통해 설치 합니다.

pip install gunicorn
...
Successfully installed gunicorn-21.2.0 packaging-23.2

실행

Gunicorn을 사용하여 Uvicorn 워커를 실행하는 예시입니다.

gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80
  • main:app: main.py 파일의 app 객체를 사용.
  • --workers 4: Gunicorn이 생성할 워커 프로세스의 수.
  • --worker-class uvicorn.workers.UvicornWorker: 워커 클래스로 Uvicorn을 지정. Uvicorn의 ASGI 지원을 활용하여 비동기 애플리케이션을 실행.
  • --bind 0.0.0.0:80: 서버가 요청을 수신할 주소와 포트를 지정. 0.0.0.0:80은 모든 인터페이스의 80번 포트에 서버를 바인딩.

테스트

FastAPI를 사용하여 간단한 API를 만들고 테스트 해보겠습니다.

main.py

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

port 8000으로 실행 합니다.

gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000

웹 브라우저를 열고 http://localhost:8000/로 접속하면 아래의 결과를 확인 할 수 있습니다.

{"message":"Hello World"}

'웹 프레임워크 > FastAPI' 카테고리의 다른 글

FastAPI - Session  (0) 2024.04.05
FastAPI - 22 (Nginx)  (0) 2024.01.07
FastAPI - 20 (APIRouter)  (0) 2023.12.26
FastAPI - 19 (DB - PostgresSQL)  (0) 2023.12.26
FastAPI - 18 (보안4 - QAuth2, Bearer, JWT - 클라이언트 구성 )  (0) 2023.12.24