FastAPI 是将机器学习模型投入生产的绝佳工具。在本文中,我将简要介绍如何使用 Nginx 轻松地将 FastAPI 投入生产环境到 AWS EC2 实例。

FastAPI 基础知识

来自 FastAPI 网站:

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示使用 Python 3.6+ 构建 API。

最小代码示例

首先,让我们安装 FastAPI:

点安装fastapi

首先,我们从 fastapi 模块导入 fastAPI 类,然后实例化这个类来创建对象 app。然后,我们定义一个以 JSON 格式返回简单消息的函数。这个函数有一个装饰器,它在指定的路径上定义了一个 GET 方法。

运行你的应用程序

在运行您的应用程序之前,您还需要安装uvicorn,这是运行我们 API 的轻量级服务器实现。

点安装 uvicorn

现在我们准备好使用以下命令运行位于 main.py 文件中的应用程序“app”:

uvicorn 主:应用程序

默认情况下,API 将在http://127.0.0.1:8000.

自动健壮文档

FastAPI 的特点之一是其功能严重依赖类型提示。它使用Pydantic(用于数据解析和验证的 Python 库)和标准类型提示来创建和检查数据模型,从而使您能够自动创建强大的 API 文档。

默认情况下,文档位于您的 API 域/文档中。如果您在本地运行它,它将在http://127.0.0.1:8000/docs (由Swagger UI提供)中可用。

或者,Redoc提供的另一个自动文档将在http://127.0.0.1:8000/redoc .

关于Nginx的一些话

Nginx 是一个用 C 语言编写的开源 Web 服务器,旨在成为世界上最快的 Web 服务器。它由 Igor Sysoev 于 2004 年创建。

Web 服务器是一个程序,它使用 HTTP(超文本传输协议)向用户提供构成网页的文件,以响应用户的请求。

除了 Nginx,还有其他知名的 Web 服务器,例如 Apache 或 IIS。

Nginx 也可以用作反向和正向代理、负载均衡器以及其他作为 API 网关的东西。

为什么要使用 Nginx?

无论使用 uvicorn,使用 Nginx 公开我们的 API 都有几个优点,但本文最强调的一个是能够轻松添加 SSL 证书。

部署步骤

部署过程包括以下步骤:

  1. 创建并启动 AWS EC2 实例。

  2. 通过安装 Nginx 和 API 要求配置 AWS EC2 实例

3.配置Nginx。

  1. 使用 OpenSSL 添加 SSL 证书。

创建并启动 AWS EC2 实例。

登录到您的 AWS 账户后,转到:

服务 -> 计算 -> EC2 -> 启动实例

现在您必须按照以下步骤操作:

第 1 步:选择 Amazon 系统映像 (AMI)

我选择了 Ubuntu 18.04 服务器(请注意,它符合免费套餐条件)。

! zoz100037](https://devpress-image.s3.cn-north-1.jdcloud-oss.com/a/08e37e34af_1*rsxrw24yuLymN6imvv-AYA.jpg)

**第 2 步:选择实例类型

**我选择了以下,这也是符合免费等级的条件。

然后,我们保留以下步骤的默认设置:

**步骤 3:配置实例详细信息

第 4 步:添加存储

第 5 步:添加标签**

**第 6 步:配置安全组

**通过单击“添加规则”,我们将确保添加 HTTP 和 HTTPS 类型

**第 7 步:查看实例启动

**最后,我们审核并启动实例。当您单击“启动”按钮时,系统将提示您创建密钥对。创建并下载它。您将需要它来访问您刚刚创建的实例。

通过安装 Nginx 和 API 要求配置 AWS EC2 实例

现在实例已启动并运行,我们将通过 SSH 访问它并对其进行配置。为此,请转到服务 -> 计算 -> EC2 -> 实例

您应该看到您的实例正在运行:

选择实例并转到操作 -> 连接 -> SSH 客户端

您将在此处找到有关如何通过 SSH 连接到您的实例的详细示例。在我的特殊情况下(因为我将密钥对命名为“fastapi-nginx.cer”并将其下载到我的“Downloads”文件夹),我将使用此命令来访问我的实例:

ssh -i 下载/fastapi-nginx.cer ubuntu@ec2-18-116-199-161.us-east-2.compute.amazonaws.com

恭喜,您刚刚通过 SSH 访问了您的 EC2 实例:

现在让我们克隆我为本教程准备的存储库。您将看到它包含一个使用 fastAPI 制作的 API 的最小示例。

git clone https://github.com/lcalcagni/Deploying-FastAPI-using-Nginx.git

进入项目目录安装需求:

cd Deploying-FastAPI-using-Nginxsudo apt-get updatesudo apt install python3-pippip3 install -r requirements.txt

让我们在本地运行 API 以检查一切是否正常:

python3 -m uvicorn main:app

你会得到这样的东西:

所以现在让我们使用 Nginx 让世界其他地方都可以访问这个 API。

Nginx 配置

首先,使用以下命令安装 Nginx:

sudo apt install nginx

我们已经有了我们希望提供的 fastAPI API,现在我们需要创建服务器块来告诉 Nginx 如何做到这一点。

默认情况下,Nginx 包含一个名为default的服务器块。你可以在这个位置找到它:etc/nginx/sites-enabled

但是我们会新建一个名为“fastapi_nginx”(你可以选择其他名字):

cd /etc/nginx/sites-enabled/sudo nano fastapi_nginx

在这个文件中,我们必须指定以下内容:

服务器{听80;服务器_名称 18.116.199.161;位置/{代理_passhttp://127.0.0.1:8000;}}

其中 server_name 包含您的实例的公共 IP。就我而言,它是 18.116.199.161

使用此配置,您是在告诉 Nginx,您在http://127.0.0.1:8000上运行的内容应该提供给http://18.116.199.161/(端口 80)。

我们保存该文件(Ctrl X)然后运行

sudo 服务 nginx 重启

然后,我们运行 API

cd path/to/Deploying-FastAPI-using-Nginxpython3 -m uvicorn main:app

然后,尝试使用本地计算机上的浏览器访问 http://{your EC2 public IP}/。您应该看到如下内容:

恭喜!现在您的 API 可供世界其他地方访问。

使用 OpenSSL 添加自签名 SSL 证书

安装 OpenSSL 并创建 /etc/nginx/ssl 目录:

sudo apt-get install opensslcd /etc/nginx

须藤 mkdir ssl

然后,我们使用以下命令创建自签名 SSL 证书:

sudo openssl req -batch -x509 -nodes -days 365 \-newkey rsa:2048 \-keyout /etc/nginx/ssl/server.key \-out /etc/nginx/ssl/server.crt

之后,我们将此证书添加到我们的服务器块配置中:

cd /etc/nginx/sites-enabled/sudo nano fastapi_nginx

在文件中,我们进行以下修改:

服务器{听80;听 443 ssl;开启ssl; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key;服务器_名称 18.116.199.161;位置/{代理_passhttp://127.0.0.1:8000;}}

我们保存该文件(Ctrl X),然后重新启动 Nginx:

sudo 服务 nginx 重启

最后,我们运行我们的 API:

cd path/to/Deploying-FastAPI-using-Nginxpython3 -m uvicorn main:app

如果一切正常,您现在应该可以通过 HTTPS 访问您的服务器(https://{yourEC2 public IP}/)。您的网络浏览器(在这种情况下我使用的是 Firefox)可能会显示如下警告:

这是预期的,因为您使用的证书类型(自签名)。因此,您必须手动确认您信任服务器才能访问它。

一旦您通过单击高级按钮确认,您将在https://{yourEC2 public IP}/ 上看到您的 API:

请注意,可以将 HTTP 重定向到 HTTPS,将其添加到服务器块配置(有关更多信息,请查看这个):

返回 301https://$server_name$request_uri;

不要忘记重新启动 Nginx 以应用更改:

sudo 服务 nginx 重启

我希望你觉得这篇文章有用。如果您有任何疑问,可以在LinkedIn上找到我。

快乐部署!

**劳拉·卡尔卡尼

**软件数据工程师

Logo

开发云社区提供前沿行业资讯和优质的学习知识,同时提供优质稳定、价格优惠的云主机、数据库、网络、云储存等云服务产品

更多推荐