likes
comments
collection
share

(十一)FastAPI的部署与运维

作者站长头像
站长
· 阅读数 25

将 FastAPI 应用部署到生产环境是确保应用可用性和性能的关键步骤。本文将详细介绍 FastAPI 部署与运维的最佳实践,包括选择服务器、配置环境、自动化部署和监控等方面,帮助你高效、安全地管理 FastAPI 应用。

1. 选择服务器与环境

1.1 选择 ASGI 服务器

FastAPI 是基于 ASGI 的,因此需要选择一个支持 ASGI 的服务器。常用的 ASGI 服务器有:

  • Uvicorn:高性能,适合生产环境。
  • Daphne:适合需要支持 Django Channels 的项目。
  • Hypercorn:支持多种异步框架和 HTTP/2。

推荐使用 Uvicorn 进行部署。

1.2 配置环境

确保生产环境中有 Python 运行环境,并安装必要的依赖:

pip install fastapi uvicorn

2. 使用 Uvicorn 部署 FastAPI 应用

创建一个简单的 FastAPI 应用 main.py

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello, World!"}

使用 Uvicorn 运行应用:

uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4

参数说明:

  • --host 0.0.0.0:监听所有网络接口。
  • --port 8000:监听端口 8000。
  • --workers 4:使用 4 个工作进程,以提升并发处理能力。

(十一)FastAPI的部署与运维

3. 使用 Gunicorn 进行高级部署

Uvicorn 可以与 Gunicorn 结合,提供更多高级功能。首先安装 Gunicorn:

pip install gunicorn
pip install uvicorn[gunicorn]

创建一个 Gunicorn 配置文件 gunicorn_conf.py

import multiprocessing

workers = multiprocessing.cpu_count() * 2 + 1
bind = "0.0.0.0:8000"
worker_class = "uvicorn.workers.UvicornWorker"

使用 Gunicorn 启动应用:

gunicorn -c gunicorn_conf.py main:app

4. 使用 Docker 部署

使用 Docker 可以将应用及其依赖封装在一个容器中,便于部署和迁移。

4.1 创建 Dockerfile

创建一个 Dockerfile

# 使用官方的Python镜像作为基础镜像
FROM python:3.10-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"]

4.2 构建和运行 Docker 镜像

构建 Docker 镜像:

docker build -t myfastapiapp .

运行 Docker 容器:

docker run -d --name myfastapiapp_container -p 8000:8000 myfastapiapp

5. 自动化部署

自动化部署工具可以简化和加速部署流程。常用的自动化部署工具有:

  • Ansible:配置管理和自动化部署工具。

  • Jenkins:持续集成和持续交付工具。

  • GitHub Actions:GitHub 提供的 CI/CD 服务。

5.1 使用 GitHub Actions 进行自动化部署(后续出专题文章)

创建 GitHub Actions 配置文件 .github/workflows/deploy.yml

name: Deploy FastAPI App

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout code
      uses: actions/checkout@v2

    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: 3.10

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt

    - name: Build and push Docker image
      run: |
        docker build -t myfastapiapp .
        docker tag myfastapiapp mydockerhubuser/myfastapiapp:latest
        echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
        docker push mydockerhubuser/myfastapiapp:latest

    - name: Deploy to server
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.SERVER_HOST }}
        username: ${{ secrets.SERVER_USER }}
        key: ${{ secrets.SERVER_SSH_KEY }}
        script: |
          docker pull mydockerhubuser/myfastapiapp:latest
          docker stop myfastapiapp_container || true
          docker rm myfastapiapp_container || true
          docker run -d --name myfastapiapp_container -p 8000:8000 mydockerhubuser/myfastapiapp:latest

6. 监控与日志(作者尚未实践)

监控和日志是确保应用运行稳定的重要手段。

6.1 使用 Prometheus 和 Grafana 进行监控

FastAPI 支持与 Prometheus 集成,通过 prometheus_client 库导出指标。

安装 prometheus_client

pip install prometheus_client

main.py 中添加 Prometheus 支持:

from fastapi import FastAPI
from prometheus_client import start_http_server, Counter

app = FastAPI()

REQUEST_COUNT = Counter('request_count', 'Total number of requests')

@app.on_event("startup")
def startup_event():
    start_http_server(8001)

@app.middleware("http")
async def count_requests(request, call_next):
    REQUEST_COUNT.inc()
    response = await call_next(request)
    return response

@app.get("/")
def read_root():
    return {"message": "Hello, World!"}

配置 Prometheus 监控 FastAPI 应用:

scrape_configs:
  - job_name: 'fastapi'
    static_configs:
      - targets: ['localhost:8001']

6.2 使用 ELK(Elasticsearch, Logstash, Kibana)进行日志管理

ELK 堆栈是一个强大的日志管理解决方案。

配置 uvicorn 输出结构化日志:

uvicorn main:app --log-config log_config.yaml

创建 log_config.yaml

version: 1
formatters:
  access:
    "()": uvicorn.logging.AccessFormatter
    fmt: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    formatter: access
    stream: ext://sys.stdout
loggers:
  uvicorn:
    handlers: [console]
    level: INFO
    propagate: False
  uvicorn.error:
    level: INFO
    handlers: [console]
    propagate: False
  uvicorn.access:
    level: INFO
    handlers: [console]
    propagate: False

7. 常见问题与解决方案

  • 性能优化:使用缓存、数据库连接池、异步编程等优化性能。
  • 安全性:使用 HTTPS、配置防火墙、定期更新依赖等确保安全。
  • 故障恢复:配置自动重启策略、使用容器编排工具(如 Kubernetes)提高容错性。

结论

FastAPI 的部署和运维涉及多个方面,从选择服务器和环境配置,到使用 Docker 和自动化部署工具,再到监控和日志管理。通过本文介绍的方法和最佳实践,你可以高效地部署和运维 FastAPI 应用,确保其在生产环境中的稳定性和高性能。

希望本文能对你有所帮助,助你顺利完成 FastAPI 应用的部署与运维。如果有任何问题或需要进一步的帮助,请随时联系。

转载自:https://juejin.cn/post/7380579037113106482
评论
请登录