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 (反向代理),例如 Nginx 或 Traefik。
由 Nginx/Traefik 負責處理 HTTPS (SSL/TLS) 加密,然後將解密後的 HTTP 請求轉送給 FastAPI 容器。
總結
- 容器化:使用 Docker 打包應用程式,確保環境一致性。
- Process Manager:若在單機環境,使用 Gunicorn 搭配 Uvicorn Worker 來利用多核效能。若在 K8s 環境,可以直接用 Uvicorn 並透過 ReplicaSet 控制副本數。
- Reverse Proxy:使用 Nginx 或 Traefik 處理 HTTPS 和負載平衡。