글 / FastAPI 배포
정적 파일과 API의 단일 서버 구성
FastAPI 하나가 화면과 /api를 함께 제공하도록 구성하고, Nginx는 모든 요청을 그대로 전달한다.
단일 서버 구성의 이유
화면은 nginx가 제공하고 API만 앱으로 전달하는 구성에서는 경로가 두 곳에 분산된다. 소규모 서비스라면 앱 하나가 둘 다 제공하고, nginx는 수신한 요청을 그대로 전달하는 구성의 설정이 더 짧다.
앱 측 구성
API 경로를 먼저 등록하고, 정적 파일은 맨 마지막에 마운트한다. 순서가 반대가 되면 정적 파일 마운트가 /api 요청까지 처리하게 된다.
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를 앱 폴더로 지정하면 소스 파일이 그대로 응답으로 전송될 수 있다.
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만 둔다.