FastAPI 全栈后端(八):部署与运维

创作者: Yardon | GitHub: github.com/YardonYan | 版本: v1.0 |



开发 vs 生产环境配置

python 复制代码
# config.py
from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    APP_NAME: str = "MyApp"
    DATABASE_URL: str
    SECRET_KEY: str
    DEBUG: bool = False

    class Config:
        env_file = ".env"
        env_file_encoding = "utf-8"

settings = Settings()
bash 复制代码
# .env
DATABASE_URL=postgresql+asyncpg://user:pass@localhost/mydb
SECRET_KEY=change-me-in-production
DEBUG=true

Uvicorn 运行配置

bash 复制代码
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4 --reload
参数 说明
--workers 进程数(生产用)
--reload 热重载(仅开发)
--log-level 日志级别

Gunicorn + Uvicorn Workers

Gunicorn 负责进程管理,Uvicorn 处理异步:

bash 复制代码
gunicorn main:app \
  -w 4 \
  -k uvicorn.workers.UvicornWorker \
  -b 0.0.0.0:8000 \
  --log-level info

Docker 容器化

dockerfile 复制代码
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
yaml 复制代码
# docker-compose.yml
services:
  api:
    build: .
    ports: ["8000:8000"]
    env_file: .env
    depends_on:
      db:
        condition: service_healthy
  db:
    image: postgres:16-alpine
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

健康检查与监控

python 复制代码
from fastapi import FastAPI

app = FastAPI()

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

@app.get("/ready")
async def ready():
    # 检查数据库连接
    try:
        await db.execute(select(1))
        return {"status": "ready"}
    except Exception as e:
        raise HTTPException(status_code=503, detail=str(e))

Nginx 配合健康检查做负载均衡:

nginx 复制代码
upstream api_backend {
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
}

server {
    location / {
        proxy_pass http://api_backend;
        proxy_set_header Host $host;
    }
    location /health {
        proxy_pass http://api_backend/health;
    }
}

环境变量与安全

bash 复制代码
# 永远不要把 secrets 提交到 Git!
# .gitignore
.env
.env.*
python 复制代码
import os
SECRET_KEY = os.getenv("SECRET_KEY")  # Kubernetes Secret 注入

日志管理

python 复制代码
import logging
from contextlib import asynccontextmanager
import structlog

structlog.configure(
    processors=[
        structlog.processors.TimeStamper(fmt="iso"),
        structlog.processors.JSONRenderer()
    ]
)

FastAPI 全栈总结

章节 核心内容
第1章 FastAPI vs Flask,类型驱动,自动文档
第2章 RESTful 路由,Pydantic 模型,请求/响应模型
第3章 SQLAlchemy 2.0 异步,Alembic 迁移
第4章 JWT 认证,bcrypt 密码,OAuth2
第5章 BackgroundTasks / Celery 后台任务
第6章 中间件,CORS,依赖注入
第7章 pytest + TestClient 异步测试
第8章 Docker 部署,Gunicorn,Nginx,健康检查

📌 创作者: Yardon | 🏠 个人网站: GlimmerAI.top

📖 本章是「FastAPI 全栈后端」系列的终章!FastAPI 路线全部完成 🎉

🎉 下一个系列:「LangChain + RAG 实战」------构建你的第一个 AI 应用。欢迎大家来观看!

相关推荐
xfhuangfu5 分钟前
Oracle中建立到CDB和PDB的连接
数据库·oracle·rpc
小小龙学IT18 分钟前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
NineData30 分钟前
DTCC 2026 预告|NineData CEO& 创始人叶正盛:面向 AI Agent 的数据库 DevOps 与数据复制实践
数据库·人工智能·数据库开发·devops·ninedata·数据库技术·dtcc
刘某的Cloud44 分钟前
ceph osd 导入导出 rbd volume 卷
linux·运维·ceph·volume
J_bean1 小时前
MySQL 事务是否必须手动开启?
数据库·mysql·数据库事务·自动提交·手动提交
J_bean1 小时前
MySQL InnoDB 如何检测死锁、判定死锁、处理死锁
数据库·mysql·死锁·死锁检测·处理死锁·死锁判定
浪子明X2 小时前
从 MongoDB 文档到关系模型:构建可重跑、可对账的数据迁移流水线
数据库·mongodb·oracle
杜子不疼.2 小时前
国产数据库撑起固井软件自主化:金仓 × 中海油服「海恒 Cemsol」落地解析
数据库
隔窗听雨眠2 小时前
GBase 8s并发控制深度解析:封锁机制、隔离级别与死锁处理全攻略
服务器·数据库·oracle
刀客Doc2 小时前
即时零售不只是多一个渠道,品牌开始重做终端生意
大数据·数据库