글 / FastAPI 배포

정적 파일과 API의 단일 서버 구성

FastAPI 하나가 화면과 /api를 함께 제공하도록 구성하고, Nginx는 모든 요청을 그대로 전달한다.

작성일 · 읽는 시간 2분 · FastAPI 0.141 기준

단일 서버 구성의 이유

화면은 nginx가 제공하고 API만 앱으로 전달하는 구성에서는 경로가 두 곳에 분산된다. 소규모 서비스라면 앱 하나가 둘 다 제공하고, nginx는 수신한 요청을 그대로 전달하는 구성의 설정이 더 짧다.

경로가 분산된 구성과 앱 하나가 둘 다 제공하는 구성

앱 측 구성

API 경로를 먼저 등록하고, 정적 파일은 맨 마지막에 마운트한다. 순서가 반대가 되면 정적 파일 마운트가 /api 요청까지 처리하게 된다.

API 경로와 정적 파일의 등록 순서에 따른 /api 요청 처리

pythonmain.py
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles

app = FastAPI()


@app.get("/api/health")
async def health():
    return {"status": "ok"}


# 정적 파일은 다른 경로를 모두 등록한 뒤에 붙인다
app.mount("/", StaticFiles(directory="web", html=True), name="web")

Nginx 측 설정

root를 두지 않고 모든 요청을 전달한다. root를 앱 폴더로 지정하면 소스 파일이 그대로 응답으로 전송될 수 있다.

nginx
location / {
    proxy_pass http://127.0.0.1:5011;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

정리

  • 경로는 API를 먼저 등록하고, 정적 파일을 나중에 등록한다.
  • nginx에는 root 없이 proxy_pass만 둔다.