部署 FastAPI 应用是一个重要的步骤,尤其是对于生产环境的应用。我们通常需要考虑高并发、负载均衡、安全性等因素。本文将展示如何使用 Uvicorn 和 Gunicorn 部署 FastAPI 应用,如何将应用容器化并部署到 Docker 中,最终将应用部署到 阿里云。
1. 使用 Uvicorn 和 Gunicorn 部署 FastAPI 应用
1.1 使用 Uvicorn 直接运行 FastAPI 应用
Uvicorn 是一个 ASGI 服务器,FastAPI 正是基于 ASGI 架构的,它非常适合处理高并发的 HTTP 请求。使用 Uvicorn 运行 FastAPI 应用非常简单:
# 安装 Uvicorn
pip install uvicorn
# 运行 FastAPI 应用
uvicorn main:app --reload
main:app
表示你的 FastAPI 应用文件main.py
中的app
实例。--reload
使应用在开发过程中自动重载(仅用于开发环境)。
1.2 使用 Gunicorn 配合 Uvicorn 进行生产环境部署
在生产环境中,我们通常会使用 Gunicorn 配合 Uvicorn 来处理并发请求。Gunicorn 是一个多进程的 WSGI 服务器,它通过 uvicorn.workers.UvicornWorker
实现对 ASGI 应用的支持。
1.2.1 安装 Gunicorn 和 Uvicorn
# 安装 Gunicorn 和 Uvicorn
pip install gunicorn uvicorn
1.2.2 使用 Gunicorn 启动应用
# 使用 Gunicorn 启动 FastAPI 应用
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app
-w 4
:启动 4 个工作进程来处理请求。根据机器的 CPU 核心数可以调整工作进程数。-k uvicorn.workers.UvicornWorker
:指定使用 Uvicorn 作为工作进程。
1.3 Gunicorn 配置文件
你还可以通过配置文件来定制 Gunicorn 的行为。例如,你可以创建一个 gunicorn_config.py
配置文件,内容如下:
bind = "0.0.0.0:8000"
workers = 4
worker_class = "uvicorn.workers.UvicornWorker"
然后,通过以下命令使用配置文件启动 Gunicorn:
gunicorn -c gunicorn_config.py main:app
2. 将 FastAPI 应用容器化(Docker 部署)
为了方便部署到不同的环境中,尤其是在云平台上,通常会将应用容器化。Docker 是容器化应用的首选工具,它允许我们打包应用及其依赖,并确保应用在任何环境中都能一致运行。
2.1 创建 Dockerfile
首先,我们需要为 FastAPI 应用编写一个 Dockerfile
,来构建镜像并运行应用。以下是一个简单的 Dockerfile
示例:
# 使用官方 Python 镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制当前目录下的所有文件到容器中的 /app 目录
COPY . /app
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 暴露端口
EXPOSE 8000
# 运行 Gunicorn 和 Uvicorn 启动应用
CMD ["gunicorn", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "main:app"]
代码解析:
FROM python:3.9-slim
:使用官方 Python 镜像,slim
版本比较小,适合生产环境。WORKDIR /app
:设置容器内的工作目录为/app
。COPY . /app
:将当前目录的内容复制到容器内的/app
目录。RUN pip install --no-cache-dir -r requirements.txt
:安装应用所需的 Python 库。EXPOSE 8000
:暴露容器的 8000 端口。CMD ["gunicorn", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "main:app"]
:通过 Gunicorn 和 Uvicorn 启动应用。
2.2 创建 requirements.txt
requirements.txt
文件列出了所有 Python 库的依赖。在应用目录下创建一个 requirements.txt
文件,内容如下:
fastapi
uvicorn
gunicorn
2.3 构建和运行 Docker 容器
- 构建 Docker 镜像:
docker build -t fastapi-app .
- 运行 Docker 容器:
docker run -d -p 8000:8000 fastapi-app
-d
:后台运行容器。-p 8000:8000
:将容器的 8000 端口映射到主机的 8000 端口。
现在,你的 FastAPI 应用已经在 Docker 容器中运行,可以通过 http://localhost:8000
进行访问。
3. 将 Docker 容器部署到阿里云
阿里云提供了多种服务来部署和托管应用,常见的有 ECS(Elastic Compute Service) 和 容器服务。下面介绍如何将 Docker 容器部署到阿里云的 ECS 实例 上。
3.1 创建并配置 ECS 实例
- 登录到阿里云控制台,进入 ECS 控制台。
- 创建一个新的 ECS 实例,并选择一个合适的操作系统(例如,选择 Ubuntu)。
- 配置安全组规则,确保 8000 端口对外开放,以便可以访问应用。
- 配置 SSH 密钥或密码以便远程连接实例。
3.2 安装 Docker
在 ECS 实例上运行以下命令来安装 Docker(以 Ubuntu 为例):
# 更新包列表
sudo apt-get update
# 安装 Docker
sudo apt-get install -y docker.io
# 启动并设置 Docker 在系统启动时自动启动
sudo systemctl start docker
sudo systemctl enable docker
3.3 通过 SSH 连接到 ECS 实例
使用以下命令通过 SSH 连接到你的 ECS 实例:
ssh -i /path/to/your/key.pem ubuntu@your-ecs-public-ip
3.4 将 Docker 镜像推送到阿里云镜像仓库(ACR)
你可以将构建的 Docker 镜像推送到阿里云的 容器镜像服务(ACR),然后从 ACR 拉取镜像到 ECS 实例上。
- 登录到阿里云 容器镜像服务。
- 创建一个新的镜像仓库。
- 获取 ACR 仓库的登录地址和认证命令。
在本地使用以下命令登录到 ACR:
docker login --username=your-username --password=your-password registry.cn-hangzhou.aliyuncs.com
然后将 Docker 镜像标记并推送到 ACR:
docker tag fastapi-app registry.cn-hangzhou.aliyuncs.com/your-repository/fastapi-app:latest
docker push registry.cn-hangzhou.aliyuncs.com/your-repository/fastapi-app:latest
3.5 在 ECS 实例上拉取并运行镜像
- 登录到你的 ECS 实例。
- 拉取你推送到 ACR 的 Docker 镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/your-repository/fastapi-app:latest
- 运行 Docker 容器:
docker run -d -p 8000:8000 registry.cn-hangzhou.aliyuncs.com/your-repository/fastapi-app:latest
3.6 配置阿里云负载均衡(可选)
为了应对高并发流量,阿里云提供了 负载均衡(SLB) 服务,你可以配置负载均衡,将流量分发到多个 ECS 实例或容器中。
4. 总结
在本教程中,我们展示了如何使用 Uvicorn 和 Gunicorn 部署 FastAPI 应用,并将其容器化,最后部署到阿里云。部署过程中涉及了以下几个步骤:
- 使用 Uvicorn 和 Gunicorn 启动 FastAPI 应用。
- 创建 Docker 镜像并运行容器化应用。
- 将 Docker 容器部署到阿里云 ECS 实例,或者通过 ACR 推送镜像后拉取到 ECS 实