(十一)FastAPI的部署与运维
将 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 个工作进程,以提升并发处理能力。
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