서버 워커 - Uvicorn with Workers
서버 워커 - Uvicorn with Workers (Server Workers - Uvicorn with Workers)
앞서 다뤘던 배포 개념들을 다시 돌아볼게요:
- 보안 - HTTPS
- 시작 시 실행(Running on startup)
- 재시작(Restarts)
- 복제(Replication - 실행 중인 프로세스 수)
- 메모리(Memory)
- 시작 전 사전 단계(Previous steps before starting)
지금까지 문서의 모든 튜토리얼을 따라오면서, 아마 서버 프로그램을 하나 실행해 왔을 거예요. 예를 들어 fastapi 명령으로 Uvicorn을 실행해서 단일 프로세스로 돌리는 식이요.
앱을 배포할 때는 프로세스의 복제를 두어 여러 코어를 활용하고 더 많은 요청을 처리할 수 있게 하고 싶을 거예요.
배포 개념 장에서 봤듯이, 사용할 수 있는 전략이 여러 가지 있어요.
여기서는 fastapi 명령이나 uvicorn 명령을 직접 사용해서 Uvicorn을 워커 프로세스와 함께 쓰는 법을 보여드릴게요.
📝 참고: Docker나 Kubernetes 같은 컨테이너를 쓴다면, 그 내용을 다음 장 FastAPI in Containers - Docker 에서 더 자세히 알려드릴게요.
특히 Kubernetes에서 실행할 때는 워커를 쓰지 않고 컨테이너당 단일 Uvicorn 프로세스를 실행하고 싶을 거예요. 그 내용도 그 장에서 다룰게요.
출처: 공식문서
여러 워커
--workers 명령줄 옵션으로 여러 워커를 시작할 수 있어요:
fastapi 명령을 쓴다면:
fastapi run --workers 4 main.py
FastAPI Starting production server 🚀
Searching for package file structure from directories with
__init__.py files
Importing from /home/user/code/awesomeapp
module 🐍 main.py
code Importing the FastAPI app object from the module with the
following code:
from main import app
app Using import string: main:app
server Server started at http://0.0.0.0:8000
server Documentation at http://0.0.0.0:8000/docs
Logs:
INFO Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO Started parent process [27365]
INFO Started server process [27368]
INFO Started server process [27369]
INFO Started server process [27370]
INFO Started server process [27367]
INFO Waiting for application startup.
INFO Waiting for application startup.
INFO Waiting for application startup.
INFO Waiting for application startup.
INFO Application startup complete.
INFO Application startup complete.
INFO Application startup complete.
INFO Application startup complete.
uvicorn 명령을 직접 쓰는 걸 선호한다면:
uv run uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
INFO: Started parent process [27365]
INFO: Started server process [27368]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Started server process [27369]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Started server process [27370]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Started server process [27367]
INFO: Waiting for application startup.
INFO: Application startup complete.
여기서 새로운 옵션은 --workers 하나뿐이에요. Uvicorn에게 워커 프로세스를 4개 시작하라고 알려주는 거죠.
또한 각 프로세스의 PID가 표시되는 걸 볼 수 있어요. 27365는 부모 프로세스(이게 프로세스 매니저)이고, 각 워커 프로세스에 하나씩: 27368, 27369, 27370, 27367가 있어요.
배포 개념
여기서 여러 워커를 사용해 앱 실행을 병렬화하고, CPU의 여러 코어를 활용하며, 더 많은 요청을 서빙하는 법을 봤어요.
위 배포 개념 목록에서 워커를 쓰는 건 주로 복제 부분에 도움이 되고, 재시작에도 조금 도움이 돼요. 하지만 나머지는 여전히 직접 처리해야 해요:
- 보안 - HTTPS
- 시작 시 실행
- 재시작
- 복제(실행 중인 프로세스 수)
- 메모리
- 시작 전 사전 단계
컨테이너와 Docker
다음 장 FastAPI in Containers - Docker 에서는 나머지 배포 개념들을 처리하기 위해 쓸 수 있는 전략 몇 가지를 설명할게요.
단일 Uvicorn 프로세스를 실행하는 이미지를 처음부터 직접 빌드하는 법을 보여드릴게요. 간단한 과정이고, Kubernetes 같은 분산 컨테이너 관리 시스템을 쓸 때 아마 원하는 방식일 거예요.
요약 (Recap)
fastapi 또는 uvicorn 명령의 --workers CLI 옵션을 사용해 여러 워커 프로세스를 실행해서 멀티코어 CPU를 활용하고 여러 프로세스를 병렬로 실행할 수 있어요.
나만의 배포 시스템을 직접 구축하면서 다른 배포 개념들도 스스로 처리한다면, 이런 도구와 아이디어를 쓸 수 있어요.
다음 장에서 FastAPI를 컨테이너(예: Docker, Kubernetes)와 함께 다루는 걸 확인해 보세요. 그 도구들이 나머지 배포 개념들도 간단한 방법으로 해결해 준다는 걸 알게 될 거예요. ✨