콘텐츠로 이동

서버 워커 - 구니콘과 유비콘

전단계에서의 배포 개념들을 다시 확인해보겠습니다:

  • 보안 - HTTPS
  • 서버 시작과 동시에 실행하기
  • 재시작
  • 복제본 (실행 중인 프로세스의 숫자)
  • 메모리
  • 시작하기 전의 여러 단계들

지금까지 문서의 모든 튜토리얼을 참고하여 단일 프로세스로 Uvicorn과 같은 서버 프로그램을 실행했을 것입니다.

애플리케이션을 배포할 때 다중 코어를 활용하고 더 많은 요청을 처리할 수 있도록 프로세스 복제본이 필요합니다.

전 과정이었던 배포 개념들에서 본 것처럼 여러가지 방법이 존재합니다.

지금부터 구니콘유비콘 워커 프로세스와 함께 사용하는 방법을 알려드리겠습니다.

정보

만약 도커와 쿠버네티스 같은 컨테이너를 사용하고 있다면 다음 챕터 FastAPI와 컨테이너 - 도커에서 더 많은 정보를 얻을 수 있습니다.

특히, 쿠버네티스에서 실행할 때는 구니콘을 사용하지 않고 대신 컨테이너당 하나의 유비콘 프로세스를 실행하는 것이 좋습니다. 이 장의 뒷부분에서 설명하겠습니다.

구니콘과 유비콘 워커

GunicornWSGI 표준을 주로 사용하는 애플리케이션 서버입니다. 이것은 구니콘이 플라스크와 쟝고와 같은 애플리케이션을 제공할 수 있다는 것을 의미합니다. 구니콘 자체는 최신 ASGI 표준을 사용하기 때문에 FastAPI와 호환되지 않습니다.

하지만 구니콘은 프로세스 관리자역할을 하고 사용자에게 특정 워커 프로세스 클래스를 알려줍니다. 그런 다음 구니콘은 해당 클래스를 사용하여 하나 이상의 워커 프로세스를 시작합니다.

그리고 유비콘구니콘과 호환되는 워커 클래스가 있습니다.

이 조합을 사용하여 구니콘은 프로세스 관리자 역할을 하며 포트IP를 관찰하고, 유비콘 클래스를 실행하는 워커 프로세스로 통신 정보를 전송합니다.

그리고 나서 구니콘과 호환되는 유비콘 워커 클래스는 구니콘이 보낸 데이터를 FastAPI에서 사용하기 위한 ASGI 표준으로 변환하는 일을 담당합니다.

구니콘과 유비콘 설치하기

$ pip install "uvicorn[standard]" gunicorn

---> 100%

이 명령어는 유비콘 standard 추가 패키지(좋은 성능을 위한)와 구니콘을 설치할 것입니다.

구니콘을 유비콘 워커와 함께 실행하기

설치 후 구니콘 실행하기:

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

[19499] [INFO] Starting gunicorn 20.1.0
[19499] [INFO] Listening at: http://0.0.0.0:80 (19499)
[19499] [INFO] Using worker: uvicorn.workers.UvicornWorker
[19511] [INFO] Booting worker with pid: 19511
[19513] [INFO] Booting worker with pid: 19513
[19514] [INFO] Booting worker with pid: 19514
[19515] [INFO] Booting worker with pid: 19515
[19511] [INFO] Started server process [19511]
[19511] [INFO] Waiting for application startup.
[19511] [INFO] Application startup complete.
[19513] [INFO] Started server process [19513]
[19513] [INFO] Waiting for application startup.
[19513] [INFO] Application startup complete.
[19514] [INFO] Started server process [19514]
[19514] [INFO] Waiting for application startup.
[19514] [INFO] Application startup complete.
[19515] [INFO] Started server process [19515]
[19515] [INFO] Waiting for application startup.
[19515] [INFO] Application startup complete.

각 옵션이 무엇을 의미하는지 살펴봅시다:

  • 이것은 유비콘과 똑같은 문법입니다. main은 파이썬 모듈 네임 "main"을 의미하므로 main.py파일을 뜻합니다. 그리고 appFastAPI 어플리케이션이 들어 있는 변수의 이름입니다.

    • main:app이 파이썬의 import 문법과 흡사한 면이 있다는 걸 알 수 있습니다:

      from main import app
      
    • 곧, main:app안에 있는 콜론의 의미는 파이썬에서 from main import app에서의 import와 같습니다.

    • --workers: 사용할 워커 프로세스의 개수이며 숫자만큼의 유비콘 워커를 실행합니다. 이 예제에서는 4개의 워커를 실행합니다.
    • --worker-class: 워커 프로세스에서 사용하기 위한 구니콘과 호환되는 워커클래스.
    • 이런식으로 구니콘이 import하여 사용할 수 있는 클래스를 전달해줍니다:

      import uvicorn.workers.UvicornWorker
      
  • --bind: 구니콘이 관찰할 IP와 포트를 의미합니다. 콜론 (:)을 사용하여 IP와 포트를 구분합니다.

    • 만약에 --bind 0.0.0.0:80 (구니콘 옵션) 대신 유비콘을 직접 실행하고 싶다면 --host 0.0.0.0--port 80을 사용해야 합니다.

출력에서 각 프로세스에 대한 PID (process ID)를 확인할 수 있습니다. (단순한 숫자입니다)

출력 내용:

  • 구니콘 프로세스 매니저는 PID 19499로 실행됩니다. (직접 실행할 경우 숫자가 다를 수 있습니다)
  • 다음으로 Listening at: http://0.0.0.0:80을 시작합니다.
  • 그런 다음 사용해야할 uvicorn.workers.UvicornWorker의 워커클래스를 탐지합니다.
  • 그리고 PID 19511, 19513, 19514, 그리고 19515를 가진 4개의 워커를 실행합니다.

또한 구니콘은 워커의 수를 유지하기 위해 죽은 프로세스를 관리하고 재시작하는 작업을 책임집니다. 이것은 이번 장 상단 목록의 재시작 개념을 부분적으로 도와주는 것입니다.

그럼에도 불구하고 필요할 경우 외부에서 구니콘을 재시작하고, 혹은 서버를 시작할 때 실행할 수 있도록 하고 싶어할 것입니다.

유비콘과 워커

유비콘은 몇 개의 워커 프로세스와 함께 실행할 수 있는 선택지가 있습니다.

그럼에도 불구하고, 유비콘은 워커 프로세스를 다루는 데에 있어서 구니콘보다 더 제한적입니다. 따라서 이 수준(파이썬 수준)의 프로세스 관리자를 사용하려면 구니콘을 프로세스 관리자로 사용하는 것이 좋습니다.

보통 이렇게 실행할 수 있습니다:

$ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
<font color="#A6E22E">INFO</font>:     Uvicorn running on <b>http://0.0.0.0:8080</b> (Press CTRL+C to quit)
<font color="#A6E22E">INFO</font>:     Started parent process [<font color="#A1EFE4"><b>27365</b></font>]
<font color="#A6E22E">INFO</font>:     Started server process [<font color="#A1EFE4">27368</font>]
<font color="#A6E22E">INFO</font>:     Waiting for application startup.
<font color="#A6E22E">INFO</font>:     Application startup complete.
<font color="#A6E22E">INFO</font>:     Started server process [<font color="#A1EFE4">27369</font>]
<font color="#A6E22E">INFO</font>:     Waiting for application startup.
<font color="#A6E22E">INFO</font>:     Application startup complete.
<font color="#A6E22E">INFO</font>:     Started server process [<font color="#A1EFE4">27370</font>]
<font color="#A6E22E">INFO</font>:     Waiting for application startup.
<font color="#A6E22E">INFO</font>:     Application startup complete.
<font color="#A6E22E">INFO</font>:     Started server process [<font color="#A1EFE4">27367</font>]
<font color="#A6E22E">INFO</font>:     Waiting for application startup.
<font color="#A6E22E">INFO</font>:     Application startup complete.

새로운 옵션인 --workers은 유비콘에게 4개의 워커 프로세스를 사용한다고 알려줍니다.

각 프로세스의 PID를 확인할 수 있습니다. 27365는 상위 프로세스(프로세스 매니저), 그리고 각각의 워커프로세스는 27368, 27369, 27370, 그리고 27367입니다.

배포 개념들

여기에서는 유비콘 워커 프로세스를 관리하는 구니콘(또는 유비콘)을 사용하여 애플리케이션을 병렬화하고, CPU 멀티 코어의 장점을 활용하고, 더 많은 요청을 처리할 수 있는 방법을 살펴보았습니다.

워커를 사용하는 것은 배포 개념 목록에서 주로 복제본 부분과 재시작에 약간 도움이 되지만 다른 배포 개념들도 다루어야 합니다:

  • 보안 - HTTPS
  • 서버 시작과 동시에 실행하기
  • 재시작
  • 복제본 (실행 중인 프로세스의 숫자)
  • 메모리
  • 시작하기 전의 여러 단계들

컨테이너와 도커

다음 장인 FastAPI와 컨테이너 - 도커에서 다른 배포 개념들을 다루는 전략들을 알려드리겠습니다.

또한 간단한 케이스에서 사용할 수 있는, 구니콘과 유비콘 워커가 포함돼 있는 공식 도커 이미지와 함께 몇 가지 기본 구성을 보여드리겠습니다.

그리고 단일 유비콘 프로세스(구니콘 없이)를 실행할 수 있도록 사용자 자신의 이미지를 처음부터 구축하는 방법도 보여드리겠습니다. 이는 간단한 과정이며, 쿠버네티스와 같은 분산 컨테이너 관리 시스템을 사용할 때 수행할 작업입니다.

요약

당신은 구니콘(또는 유비콘)을 유비콘 워커와 함께 프로세스 관리자로 사용하여 멀티-코어 CPU를 활용하는 멀티 프로세스를 병렬로 실행할 수 있습니다.

다른 배포 개념을 직접 다루면서 자신만의 배포 시스템을 구성하는 경우 이러한 도구와 개념들을 활용할 수 있습니다.

다음 장에서 컨테이너(예: 도커 및 쿠버네티스)와 함께하는 FastAPI에 대해 배워보세요. 이러한 툴에는 다른 배포 개념들을 간단히 해결할 수 있는 방법이 있습니다. ✨