FastAPI 部署與容器化 (Docker)

開發完成後,下一步就是將應用程式部署到伺服器上讓全世界存取。

對於 FastAPI 來說,最推薦的部署方式是使用 Linux 容器 (Docker) 搭配 Gunicorn (作為 Process Manager) 和 Uvicorn (作為 ASGI Worker)。

關於 Gunicorn 與 Uvicorn

  • Uvicorn: 一個高效能的 ASGI 伺服器,負責處理 HTTP 請求並執行 FastAPI 程式碼。但是它只是一個 Process,無法充分利用多核心 CPU。
  • Gunicorn: 一個 WSGI HTTP 伺服器,擅長管理多個 Process。我們會讓 Gunicorn 啟動並管理多個 Uvicorn Worker Process,這樣就能同時利用多顆 CPU 核心。

建立 Dockerfile

最簡單的方式是使用官方優化過的 Docker Image (雖然該 Image 目前已停止維護,但其架構與 Dockerfile 寫法仍是最佳實踐的參考)。

現在我們推薦直接從 Python 官方 Image 開始建置:

# 使用 Python 3.9 (或 3.10+) 官方映像檔
FROM python:3.9

# 設定工作目錄
WORKDIR /code

# 複製 requirements.txt 並安裝依賴
# 先複製這個是為了利用 Docker Layer Cache,加快 build 速度
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

# 複製程式碼
COPY ./app /code/app

# 設定啟動指令
# 使用 fastapi run 直接啟動 (FastAPI 0.111.0+ 推薦,會自動根據環境選擇生產模式)
CMD ["fastapi", "run", "app/main.py", "--port", "80"]

如果需要 Gunicorn

如果你是在單一台 VM 上跑,想利用多核 CPU,你需要安裝 gunicorn

pip install "uvicorn[standard]" gunicorn

然後將 CMD 改為:

CMD ["gunicorn", "app.main:app", "--workers", "4", "--worker-class", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:80"]
  • --workers 4: 啟動 4 個 Worker process。
  • --worker-class uvicorn.workers.UvicornWorker: 告訴 Gunicorn 使用 Uvicorn 來處理請求。

關於 HTTPS

FastAPI 本身不處理 HTTPS。在生產環境中,你通常會在 FastAPI 前面架設一個 Reverse Proxy (反向代理),例如 NginxTraefik

由 Nginx/Traefik 負責處理 HTTPS (SSL/TLS) 加密,然後將解密後的 HTTP 請求轉送給 FastAPI 容器。

總結

  1. 容器化:使用 Docker 打包應用程式,確保環境一致性。
  2. Process Manager:若在單機環境,使用 Gunicorn 搭配 Uvicorn Worker 來利用多核效能。若在 K8s 環境,可以直接用 Uvicorn 並透過 ReplicaSet 控制副本數。
  3. Reverse Proxy:使用 Nginx 或 Traefik 處理 HTTPS 和負載平衡。