FastAPI 部署
wangzf / 2022-12-01
目录
FastAPI 版本
FastAPI 可用版本
FastAPI 版本
- FastAPI 版本
fastapi>=0.45.0,<0.46.0
- PATCH: 版本号最后一个数字,代表版本更改均用于错误修复和不间断的更改
- MINOR: 版本号中间的数字,代表版本中添加了重大更改和功能
更新 FastAPI 版本
- 首先,应该使用 FastAPI 提供的测试功能测试 APP
- 然后,更新 FastAPI 到一个比较新的版本,然后在新版本的 FastAPI 中测试 APP
- 最后,如果一切 OK,或者做了必要的修改后,通过了所有的测试,那么可以将 FastAPI 的版本固定下来
Starlette
不应该固定 starlette 的版本,因为不同的 FastAPI 版本会使用最新版本的 Starlette
Pydantic
- Pydantic 的新版本(>=1.0.0)始终与 FastAPI 兼容, 可以将 Pydantic 固定到高于 1.0.0 但低于 2.0.0 版本的任何版本
- 示例
pydantic>=1.2.0,<2.0.0
HTTPS
Deta 部署 FastAPI
Docker 部署 FastAPI
- 创建一个具有最佳西能的 FastAPI APP Docker image/container
- HTTPS 知识
- 在服务器上使用自动 HTTPS 设置 Docker Swarm 模式集群
- 使用 Docker Swarm 集群以及 HTTPS 等生成部署完整的 FastAPI APP
tiangolo/uvicorn-gunicorn-fastapi
创建一个 Dockerfile
- 进入项目目录
$ mkdir fastapi_demo
$ cd fastapi_demo
- 创建一个 Dockerfile 文件
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7
COPY ./app /app
- 如果创建一个较大的 APP
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7
COPY ./app /app/app
- 如果在 Raspberry Pi(具有 ARM 处理器) 或任何其他体系结构中运行 Docker, 则 Dockerfile 可以基于 Python 基础镜像(即多体系结构)从头开始 Docker , 并单独使用 uvicorn
FROM python:3.7
RUN pip install fastapi uvicorn
EXPOSE 80
COPY ./app /app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
创建 FastAPI 代码
- 创建一个 app 目录
- 在 app 目录中创建一个 main.py 文件
- 在 main.py 文件中写入以下内容
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {
"Hello": "Workld"
}
@app.get("/items/{item_id}")
asynv def read_item(item_id: int, q: Optional[str] = None):
return {
"item_id": item_id,
"q": q
}
构建 Docker 镜像
- 进入项目目录(Dockerfile 所在目录)
$ cd fastapi_demo
- 构建 FastAPI 的 Docker 镜像
$ docker build -t myimage .
启动 Docker 容器
- 基于构建的 Docker 镜像启动一个 Docker 容器
$ docker run -d --name muycontainer -p 80:80 myimage
- 现在在 Docker 容器中有了一个优化的 FastAPI 服务器,并针对当前服务器的 CUP 内核数自动调整性能
检查
- 打开 http://192.168.99.100/items/5?q=somequery 或 http://127.0.0.1/items/5?somequery 可以看到
{"item_id": 5, "q": "somequery"}
- 打开 http://192.168.99.100/docs 或 http://127.0.0.1/docs
- 可选DOC http://192.168.99.100/redoc 或 http://127.0.0.1/redoc
Traefik
- Traefik 是高性能的反向代理/负载平衡器,它可以执行 “TLS 终止代理"工作
- Traefik 与 Let’s Encrypt 集成,所以 Traefik 可以处理所有的 HTTPS 部分,包括证书获取和更新
- Traefik 还与 Docker 集成,因此,可以在每个 APP 配置中声明域, 并让其读取这些配置,生成 HTTPS 证书,并自动向 APP 提供 HTTPS,并无需对其配置进行任何更改
具有 Traefik 和 HTTPS 的 Docker Swarm 模式集群
- 通过使用 Docker Swarm 模式,可以从一台计算机的集群开始,然后可以根据需要添加更多服务器而增长
- 要使用 Traefik 和 HTTPS 处理设置 Docker Swarm 模式集群,请遵循以下指南:
- 部署一个 FastAPI APP最简单的方式是使用 FastAPI 项目生成器
手动部署 FastAPI
手动部署 FastAPI 只需要安装 ASGI 兼容的服务器即可:
- Uvicorn: a lightning-fast ASGI server, build on uvloop and httptools
$ pip install uvicorn[standard]
- Hypercorn: An ASGI server also compatible with HTTP/2
$ pip install hypercorn
(2)运行 APP
- 开发环境
$ uvicorn main:app --host 0.0.0.0 --port 80 -reload
- 生产环境
$ uvicorn main:app --host 0.0.0.0 --port 80
(3)如果想确保服务器停止后自动重新启动