FastAPI系列:Ubuntu部署FastAPI项目实战

news/2025/2/26 0:31:34

这篇文章提供了在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证书等方面内容,有兴趣读者可以继续探索学习。


http://www.niftyadmin.cn/n/5866995.html

相关文章

文字语音相互转换

目录 1.介绍 2.思路 3.安装python包 3.程序&#xff1a; 4.运行结果 1.介绍 当我们使用一些本地部署的语言模型的时候&#xff0c;往往只能进行文字对话&#xff0c;这一片博客教大家如何实现语音转文字和文字转语音&#xff0c;之后接入ollama的模型就能进行语音对话了。…

【LeetCodehHot100_0x01】

LeetCodeHot100_0x01 1. 两数之和 解题思路&#xff1a; 暴力枚举法、哈希法 【暴力枚举】 class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length;for(int i0;i<n;i) {for(int ji1;j<n;j) {if(nums[i] nums[j] target) {return new in…

第9章:LangChain结构化输出-示例5(基于大模型如何精确匹配POJO的字段)

如何使用LangChain4j框架创建和使用多种AI服务。它通过定义接口和注解,将自然语言处理任务(如情感分析、数字提取、日期提取、POJO提取等)封装为服务,并通过LangChain4j的AiServices动态生成这些服务的实现。 本章主要讲述基于LangChain调用大模型如何进行结构化输出的真实…

Android之APP更新(通过接口更新)

文章目录 前言一、效果图二、实现步骤1.AndroidManifest权限申请2.activity实现3.有版本更新弹框UpdateappUtilDialog4.下载弹框DownloadAppUtils5.弹框背景图 总结 前言 对于做Android的朋友来说&#xff0c;APP更新功能再常见不过了&#xff0c;因为平台更新审核时间较长&am…

【数据库】【MySQL】索引

MySQL中索引的概念 索引&#xff08;MySQL中也叫做"键&#xff08;key&#xff09;"&#xff09;是一种数据结构&#xff0c;用于存储引擎快速定找到记录。 简单来说&#xff0c;它类似于书籍的目录&#xff0c;通过索引可以快速找到对应的数据行&#xff0c;而无需…

QT中日志的使用案例 || 自动创建、管理、保存QT日志数据

目录 1.quiwidget.cpp 2.widget.cpp 3.widget.h 4.在需要记录日志的地方直接将信息插入即可 1. 释放 m_fileLog 和 m_textStream 1.1 为什么要关闭和删除 m_fileLog 和 m_textStream&#xff1f; 1.2 如果不这样做会有什么坏处&#xff1f; 3. 总结 4.参考文章 需求分析…

整数二分算法

例题&#xff1a; 给定一个按照升序排列的长度为 n 的整数数组&#xff0c;以及 q个查询。 对于每个查询&#xff0c;返回一个元素 k 的起始位置和终止位置&#xff08;位置从 0开始计数&#xff09;。 如果数组中不存在该元素&#xff0c;则返回 -1 -1。 输入格式 第一行…

5G网络切片辨析(eMBB,mMTC,uRLLC)

URLLC有三大应用场景&#xff0c;分别是eMBB&#xff08;增强型移动宽带&#xff09;、uRLLC&#xff08;高可靠低延时通信&#xff09;和mMTC&#xff08;海量机器通信&#xff09;。 增强型移动宽带&#xff08;eMBB&#xff09;&#xff1a;需要关注峰值速率&#xff0c;容…