FastAPI 应用生产环境部署与性能优化
目录
- ⚡ 使用 Uvicorn 和 Gunicorn 部署高性能 FastAPI 应用
- 🔗 配置反向代理:Nginx 与 Traefik 的高效实践
- ☁️ 将 FastAPI 应用部署到云平台
- 🐳 基于 Docker 构建与部署 FastAPI 应用
- 📈 性能优化:提升 FastAPI 应用的稳定性与响应速度
⚡ 1. 使用 Uvicorn 和 Gunicorn 部署高性能 FastAPI 应用
基本部署方案
FastAPI 是一个高效的 Web 框架,而 Uvicorn 是运行 FastAPI 的 ASGI 服务器。为了进一步提升性能,可以结合 Gunicorn 管理多个 Uvicorn 工作进程,实现高并发能力。
以下是使用 Gunicorn 和 Uvicorn 部署的基本步骤:
pip install gunicorn uvicorn
编写 main.py
文件作为应用入口:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello, FastAPI!"}
通过以下命令运行应用:
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app --bind 0.0.0.0:8000
上述命令使用 Gunicorn 创建 4 个工作进程 (-w 4
),并由 Uvicorn 执行每个进程的请求处理。绑定的地址为 0.0.0.0:8000
。
配置优化
为了满足生产环境需求,可以通过调整 Gunicorn 的配置文件实现性能优化:
# gunicorn.conf.py
workers = 4 # 工作进程数量
worker_class = "uvicorn.workers.UvicornWorker" # 使用 Uvicorn 工作线程
bind = "0.0.0.0:8000" # 绑定地址
accesslog = "-" # 记录访问日志
errorlog = "-" # 记录错误日志
loglevel = "info" # 日志级别
timeout = 30 # 超时时间
运行命令:
gunicorn -c gunicorn.conf.py main:app
此配置文件增强了管理性与可维护性,适用于复杂的生产环境。
🔗 2. 配置反向代理:Nginx 与 Traefik 的高效实践
Nginx 配置 FastAPI
反向代理通过分发流量、缓存静态内容等方式提升性能与安全性。以下是 Nginx 的配置示例:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8000; # 将流量转发到 FastAPI
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
将上述配置保存到 /etc/nginx/sites-available/fastapi
,然后创建符号链接并重启服务:
ln -s /etc/nginx/sites-available/fastapi /etc/nginx/sites-enabled/
systemctl restart nginx
使用 Traefik 作为反向代理
Traefik 是一种现代化的反向代理,支持容器化应用的动态发现与负载均衡:
以下是 docker-compose.yml
文件的配置:
version: '3.8'
services:
traefik:
image: traefik:v2.5
command:
- "--entrypoints.web.address=:80"
- "--providers.docker=true"
ports:
- "80:80"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
fastapi:
build: .
labels:
- "traefik.http.routers.fastapi.rule=Host(`example.com`)"
运行命令:
docker-compose up -d
Traefik 自动发现并管理服务的路由,实现了轻量化的反向代理配置。
☁️ 3. 将 FastAPI 应用部署到云平台
使用 AWS 部署 FastAPI
在 AWS 上部署 FastAPI 可以结合 EC2 实例与负载均衡器。
-
创建一个 EC2 实例,选择合适的操作系统(如 Ubuntu)。
-
使用 SSH 连接到实例并安装必要的软件:
sudo apt update sudo apt install python3-pip nginx pip3 install fastapi uvicorn gunicorn
-
按照前述步骤运行 FastAPI 应用,并通过 Nginx 配置反向代理。
-
使用 AWS 的负载均衡器(ELB)分发流量,提高高可用性。
部署到 DigitalOcean
DigitalOcean 的 App Platform 提供了一种无服务器方式部署 FastAPI:
-
将项目代码推送到 GitHub。
-
在 DigitalOcean App Platform 中选择 “Deploy from GitHub”。
-
配置 FastAPI 应用的启动命令:
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app
-
部署完成后,系统会自动为应用分配域名并处理流量。
🐳 4. 基于 Docker 构建与部署 FastAPI 应用
编写 Dockerfile
Docker 是一种流行的容器化工具,简化了部署流程:
# 基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 安装依赖
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
# 复制代码
COPY . .
# 启动应用
CMD ["gunicorn", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "main:app", "--bind", "0.0.0.0:8000"]
构建镜像并运行容器:
docker build -t fastapi-app .
docker run -d -p 8000:8000 fastapi-app
使用 Docker Compose 部署
通过 docker-compose.yml
管理多个服务:
version: '3.8'
services:
fastapi:
build: .
ports:
- "8000:8000"
volumes:
- ".:/app"
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: fastapi_db
运行命令:
docker-compose up -d
📈 5. 性能优化:提升 FastAPI 应用的稳定性与响应速度
配置 HTTP Keep-Alive
在生产环境中,通过设置 HTTP Keep-Alive,可以减少连接建立的开销:
gunicorn -k uvicorn.workers.UvicornWorker --keep-alive 5 main:app
使用缓存提升性能
利用 Redis 实现缓存机制,加速 API 响应速度:
import redis
from fastapi import FastAPI
app = FastAPI()
cache = redis.Redis(host='localhost', port=6379)
@app.get("/data")
async def get_data():
if (result := cache.get("data")):
return {"data": result.decode("utf-8")}
# 模拟计算或查询
result = "Expensive data"
cache.set("data", result, ex=60) # 设置缓存过期时间为 60 秒
return {"data": result}
通过合理的优化与部署方案,可以有效提升 FastAPI 应用的可用性与性能。