这篇文章提供了在Ubuntu上部署FastAPI应用程序的详细指南。首先,读者将学习如何创建项目目录并设置Python虚拟环境,接着安装FastAPI、Uvicorn和Gunicorn等必要依赖。随后,文章指导用户编写基本的FastAPI应用程序代码,并使用Gunicorn和Uvicorn运行该应用,验证API是否正常工作。
为了方便管理,文章还介绍了如何创建systemd服务单元文件,使得用户能够轻松启动、停止和重启应用程序,并确保其在系统重启时自动启动。最后,读者可以通过
systemctl status
命令检查服务的运行状态。整体而言,这篇文章为读者提供了一个清晰的步骤,帮助他们在生产环境中顺利部署FastAPI应用程序。
FastAPI是一个现代、快速、高性能的web框架,用于构建api和web应用程序。在个人电脑上编写和开发FastAPI应用程序后,您肯定想将其放到互联网上,以便全世界都可以使用和享受您的杰作。在Ubuntu上部署FastAPI应用程序是生产环境常见任务。事不宜迟,我们开始吧。
示例项目准备
本节是关于在实际服务器上设置FastAPI应用程序的全部内容。为此,首先需要创建一个目录来存储代码。执行以下命令:
mkdir /home/fastapi_example
cd /home/fastapi_example
一旦创建了目录,就需要设置虚拟环境。在Ubuntu中,你必须安装Python虚拟环境包:
sudo apt update
sudo apt install python3-venv
下一步是初始化并激活虚拟环境来运行你的代码:
python3 -m venv venv
source venv/bin/activate
现在,安装必要的依赖包:
pip install fastapi uvicorn gunicorn
一旦安装了必要的包,就需要创建应用程序文件。运行如下命令:
sudo nano main.py
现在你可以将Python代码添加到main.py文件中:
# main.py
from fastapi import FastAPI
app = FastAPI()
@ app.get("/")
def read_root():
return {
"success": True,
"message": "Welcome to Sling Academy Public API"
}
如果你已经把你的代码推送到GitHub,你可以把你的项目拉到fastapi_example目录:
git pull <your project repository URL>
然后在requirements.txt文件中安装所有包:
pip install -r requirements.txt
禁用swagger文档
在生产环境中,当然不能访问swagger接口文档,可以通过下面配置禁用文档访问。
# main.py
from fastapi import FastAPI
app = FastAPI(
docs_url=None, # Disable docs (Swagger UI)
redoc_url=None, # Disable redoc
)
运行项目
Gunicorn是Python WSGI HTTP服务器,旨在为你的FastAPI应用程序提供服务。为了验证一切正常,在fastapi_example目录下使用以下命令运行临时API:
gunicorn main:app -k uvicorn.workers.UvicornWorker
-k uvicorn.workers.UvicornWorker
,这是 Gunicorn 的一个参数,用于指定工作进程的类型,具体解释如下:
-k
:这是--worker-class
的缩写形式,其作用是指定 Gunicorn 使用的工作进程类。uvicorn.workers.UvicornWorker
:指定使用uvicorn
作为工作进程的执行器。uvicorn
是一个基于asyncio
的快速 ASGI(异步服务器网关接口)服务器,支持异步编程。通过使用uvicorn
工作进程,Gunicorn 能够以异步方式处理请求,从而提升应用程序的性能和并发处理能力。
打开另一个终端窗口,执行如下命令:
curl http://localhost:8000
你应该得到这个:
{"success":true,"message":"Welcome to Sling Academy Public API"}
按Ctrl + C停止临时web服务器,并移动到下一步以生产方式再次运行它。
创建系统服务
我们创建系统服务来管理应用程序。这样做的好处是你可以轻松地启动、重新启动和停止应用程序。此外,当系统重新启动时,您的应用程序将自动启动。
仍然,在fastapi_example目录中,为Gunicorn创建一个配置文件:
sudo nano gunicorn_conf.py
在文件中粘贴下面代码:
# gunicorn_conf.py
from multiprocessing import cpu_count
bind = "127.0.0.1:8000"
# Worker Options
workers = cpu_count() + 1
worker_class = 'uvicorn.workers.UvicornWorker'
# Logging Options
loglevel = 'debug'
accesslog = '/home/fastapi_example/access_log'
errorlog = '/home/fastapi_example/error_log'
保存并退出该文件。现在我们必须在/etc/systemd/system目录中创建一个systemd单元文件。执行以下命令:
sudo nano /etc/systemd/system/fastapi_example.service
创建服务后,向其添加以下内容:
[Unit]
Description=Gunicorn Daemon for FastAPI example
After=network.target
[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/fastapi_example
ExecStart=/home/fastapi_example/env/bin/gunicorn -c gunicorn_conf.py main:app -k uvicorn.workers.UvicornWorker
[Install]
WantedBy=multi-user.target
保存并关闭文件。下面对配置文件进行简单解释:
[Unit]
这是 Systemd 服务单元文件的一个段落,用于定义服务的通用信息和依赖关系。
Description
:对该服务的描述信息,这里表明该服务是用于 FastAPI 示例的 Gunicorn 守护进程。当你使用systemctl status
命令查看服务状态时,会显示这个描述信息,方便你识别服务。After
:指定该服务在哪些目标(target)之后启动。network.target
表示网络服务启动完成后,才会启动此服务。这是因为 FastAPI 应用通常需要网络连接,确保网络就绪后再启动服务可以避免因网络未准备好而导致的启动失败。
[Service]
该段落用于定义服务的具体运行参数和执行命令。
-
User
:指定以哪个用户身份运行该服务。这里指定为ubuntu
用户,意味着 Gunicorn 进程将以ubuntu
用户的权限运行。 -
Group
:指定服务运行时所属的用户组。www-data
通常是 Web 服务器相关的用户组,将服务进程加入该组可以方便与其他 Web 服务进行交互。 -
WorkingDirectory
:指定服务的工作目录。服务启动时,会将当前工作目录切换到/home/fastapi_example
,这样在执行命令时,相对路径会基于该目录进行解析。 -
ExecStart
:指定服务启动时要执行的命令。这里使用/home/fastapi_example/env/bin/gunicorn
来启动 Gunicorn 服务器,-c gunicorn_conf.py
表示使用gunicorn_conf.py
作为 Gunicorn 的配置文件,main:app
表示要运行的 FastAPI 应用实例,main
是 Python 模块名,app
是 FastAPI 应用对象的名称。
[Install]
该段落用于定义服务的安装信息,即服务如何在系统启动时自动启动。
WantedBy
:指定该服务被哪些目标(target)所依赖。multi-user.target
是一个常用的目标,表示多用户模式。当系统进入多用户模式时,会尝试启动被multi-user.target
所依赖的服务,因此将该服务的WantedBy
设置为multi-user.target
可以实现服务在系统启动时自动启动。
配置自动运行
启动并启用fastapi_example服务(以便在服务器重启时自动启动):
sudo systemctl start fastapi_example
sudo systemctl enable fastapi_example
运行这个命令,检查服务是否正常工作:
sudo systemctl status fastapi_example
到目前为止,我们已经成功地使用Gunicorn和Uvicorn发布了FastAPI应用程序。
最后总结
这篇文章提供了一个完整的指南,涵盖了从创建FastAPI应用程序到在Ubuntu上部署和管理该应用程序的所有步骤。通过使用Gunicorn和Uvicorn,文章展示了如何在生产环境中高效地运行FastAPI应用程序。此外,使用systemd创建服务单元文件的做法,使得应用程序的管理更加方便。生产环境完整部署,可能还需要nigix和https证书等方面内容,有兴趣读者可以继续探索学习。