使用 Nginx 将您的 FastAPI API 部署到 AWS EC2
FastAPI 是将机器学习模型投入生产的绝佳工具。在本文中,我将简要介绍如何使用 Nginx 轻松地将 FastAPI 投入生产环境到 AWS EC2 实例。 FastAPI 基础知识 来自 FastAPI 网站: FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示使用 Python 3.6+ 构建 API。 最小代码示例 首先,让我们安装 Fast
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 证书。
部署步骤
部署过程包括以下步骤:
-
创建并启动 AWS EC2 实例。
-
通过安装 Nginx 和 API 要求配置 AWS EC2 实例
3.配置Nginx。
- 使用 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上找到我。
快乐部署!
**劳拉·卡尔卡尼
**软件数据工程师
更多推荐
所有评论(0)