如何将 FastAPI 应用程序部署到 AWS EC2 服务器。
你好,技术爱好者尼克在这里。自从我发布一篇文章以来已经有一段时间了,但是嘿,我在这里,还有一篇新文章。
因此,当您使用 FastAPI 构建了 Python 应用程序并在本地对其进行测试并对其功能感到满意后,您希望将其带到 Web 并使其可公开访问。
本地设置
在本文中,我们将引导一个简单的应用程序,然后将其提交到 Github,最后将其部署到 AWS EC2 实例。
我们首先在我们的机器上创建一个本地工作区,然后导航到桌面并创建一个文件夹hello_fastapi并使用您的代码编辑器打开它。
接下来让我们创建一个虚拟环境来保存我们的依赖项。
virtualenv env
进入全屏模式 退出全屏模式
然后使用激活它
env/Scripts/activate on windows
source env/bin/activate on linux/unix
进入全屏模式 退出全屏模式
现在我们已经建立了环境,让我们安装我们需要的东西。
pip install fastapi uvicorn gunicorn psycopg2-binary
进入全屏模式 退出全屏模式
您可以根据您的项目需要什么来添加部门以工作。
安装了 deps 后,我们创建一个包含所有这些的文件。
pip freeze > requirements.txt
进入全屏模式 退出全屏模式
接下来在项目的根目录创建一个名为main.py的文件,并将以下代码添加到其中。
import uvicorn
if __name__ == "__main__":
uvicorn.run("app:app", host="0.0.0.0", port=8000, reload=True)
进入全屏模式 退出全屏模式
然后使用以下代码在名为app.py的根目录创建另一个文件:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = ["*"]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/", tags=["Root"])
async def read_root():
return {"message": "Welcome to the API!"}
进入全屏模式 退出全屏模式
让我们测试一下应用程序,看看它是否在我们的本地浏览器上运行良好:
通过以下方式运行服务器:
uvicorn app:app --reload
进入全屏模式 退出全屏模式
接下来在localhost访问您的浏览器,您应该会受到
{"message":"Welcome to bills API!"}
进入全屏模式 退出全屏模式
如果一切正常,那么我们就有了一个可以工作的应用程序,我们可以继续下一部分。
版本控制
虽然仍在项目的根目录中,但我们可以发出以下命令将代码推送到 Github:
git init
git add .
git commit -m 'initial'
git remote add origin <REMOTE URL HERE>
git push -u origin master
进入全屏模式 退出全屏模式
如果一切顺利,那么您应该将您的代码上传并存储在 Github 存储库中。我们可以安全地进行下一步。
部署到 AWS EC2
这里的假设是您有一个 AWS 帐户并创建了一个在 Ubuntu 上运行的免费层 EC2 服务器。请随时在此处](https://docs.aws.amazon.com/efs/latest/ug/gs-step-one-create-ec2-resources.html)查看有关如何执行此操作的文档[。
不过,这些步骤适用于任何 Ubuntu 机器,因此如果您使用的是 DigitalOcean、Linode 或 Oracle,它应该可以正常工作。
然后让我们 ssh 进入我们的远程机器:
ssh -i 'example.pem' ubuntu@ec2-IP-ADDRESS.us-east-2.compute.amazonaws.com
进入全屏模式 退出全屏模式
进入远程机器后,我们需要安装 Python 和 NGINX。
在终端上发出以下命令:
sudo apt update
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl
sudo -H pip3 install --upgrade pip
进入全屏模式 退出全屏模式
接下来创建一个文件夹来存放我们的文件:
mkdir apiv1 && cd apiv1
然后像之前一样创建并激活一个虚拟环境。
之后在文件夹中启动 git 并从 github 中提取您的代码。
git init
git remote add origin <REPO URL>
git pull origin master
进入全屏模式 退出全屏模式
现在我们像这样安装我们的deps:
pip install -r requirements.txt
进入全屏模式 退出全屏模式
在运行本地服务器并确保没有错误报告后停用 virtualenv。
接下来,我们需要将我们的应用程序绑定到一个 gunicorn 模块,该模块用作您的应用程序的接口,将客户端请求从 HTTP 转换为您的应用程序可以处理的 Python 调用。
所以我们首先创建一个套接字文件:
sudo nano /etc/systemd/system/gunicorn.socket
进入全屏模式 退出全屏模式
向其中添加以下代码:
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
进入全屏模式 退出全屏模式
保存并关闭该文件。接下来我们创建一个服务文件:
sudo nano /etc/systemd/system/gunicorn.service
进入全屏模式 退出全屏模式
向其中添加以下代码:
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/apiv1
ExecStart=/home/ubuntu/apiv1/env/bin/gunicorn \
--access-logfile - \
--workers 5 \
--bind unix:/run/gunicorn.sock \
--worker-class uvicorn.workers.UvicornWorker \
app:app
[Install]
WantedBy=multi-user.target
进入全屏模式 退出全屏模式
保存并关闭。
接下来启动 Gunicorn 套接字:
sudo systemctl start gunicorn.socket
进入全屏模式 退出全屏模式
然后通过以下方式启用它:
sudo systemctl enable gunicorn.socket
进入全屏模式 退出全屏模式
现在 Gunicorn 已经设置好了,接下来我们将配置 Nginx 以将流量传递给进程。
首先在 Nginx 的站点可用目录中创建并打开一个新的服务器块:
sudo nano /etc/nginx/sites-enabled/api
进入全屏模式 退出全屏模式
向其中添加以下行:
server {
listen 80;
server_name server_domain_or_IP;
location / {
proxy_pass http://unix:/run/gunicorn.sock;
}
}
进入全屏模式 退出全屏模式
也保存这个文件。通过以下方式测试配置是否正常:
sudo nginx -t
进入全屏模式 退出全屏模式
如果一切顺利,那么我们需要重新启动服务,然后继续:
sudo systemctl daemon-reload
sudo systemctl restart gunicorn
sudo systemctl restart nginx
进入全屏模式 退出全屏模式
最后一步是确保您已通过实例的安全组部分的port 80允许HTTP访问。如果您的应用程序的服务超过HTTPS,则对port 443执行相同的操作。
如果上述所有操作都完成,那么转到您实例的公共 IP 地址或域,希望您会看到您的应用程序显示在那里。
包起来
就是这样,伙计们,如果你在这里成功,那么对你来说是一个巨大的呐喊!
今天我们使用FastAPI构建了一个简单的 Python 应用程序,并将其部署到 AWS 提供的 EC2 Ubuntu 服务器上。
如果您觉得这有帮助,请通过点赞、评论或分享来表达爱意。您也可以在Twitter上关注我或访问我的网站。
谢谢你,直到下一次!
更多推荐

所有评论(0)