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

这篇文章提供了在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 FastAPIapp = 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.pyfrom fastapi import FastAPIapp = 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_countbind = "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.rhkb.cn/news/24791.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis缓存淘汰算法——LRU

文章目录 一、LRU 算法概述1.1 LRU 算法的工作原理1.2 手写LRU 二、Redis 中的 LRU 算法2.1 近似 LRU 算法2.2 如何判断“最近最少使用”的键&#xff1f;2.3 Redis 中的 LRU 配置 在 Redis 中&#xff0c; LRU&#xff08;Latest Recently Used&#xff0c;最近最少使用&…

【原创工具】同文件夹PDF文件合并 By怜渠客

【原创工具】同文件夹PDF文件合并 By怜渠客 原贴&#xff1a;可批量合并多个文件夹内的pdf工具 - 吾爱破解 - 52pojie.cn 他这个存在一些问题&#xff0c;并非是软件内自主实现的PDF合并&#xff0c;而是调用的pdftk这一工具&#xff0c;但楼主并没有提供pdftk&#xff0c;而…

C# Combox 绑定数据

1.在界面中添加一个combox 2.将数据绑定到combox List<GrindingType> type new List<GrindingType>();type.Add(new GrindingType { Id 1, Name "Product A", Type new List<string> { "1", "2" } });type.Add(new Grin…

怎样能写出完美的Prompt

怎样能写出完美的Prompt 大模型发展Prompt 实测最后感受 大模型发展 随着语言大模型的智能化演进&#xff0c;其作为内容生产引擎的核心竞争力日益凸显。如何通过Prompt工程深度释放其潜能&#xff0c;实现工作效率的指数级提升与文本质量的突破性飞跃&#xff0c;本质上是对&…

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的农村合作社招聘系统

开题报告 本文以服务新农村建设为背景&#xff0c;针对农村劳动力就业信息获取不充分、求职效率低下的问题&#xff0c;设计并实现了农村合作社招聘系统。该平台具备注册登录、个人信息管理、就业资讯发布与互动、岗位搜索、详细信息查看、岗位申请以及申请状态跟踪等功能。系…

数据结构与算法-图论-最短路-拓展运用

选择最佳路线 分析&#xff1a; 这是一道图论中的最短路径问题&#xff0c;目标是在给定的公交网络中&#xff0c;找到从琪琪家附近的车站出发&#xff0c;到她朋友家附近车站&#xff08;编号为 s &#xff09;的最短时间。以下是对该问题的详细分析&#xff1a; 问题关键信息…

鸿道Intewell操作系统的Linux实时拓展方案

在工业控制、智能制造、自动驾驶等领域&#xff0c;实时性一直是操作系统的核心挑战。Linux作为开源系统的代表&#xff0c;虽然具备生态丰富&#xff0c;功能强大的优势&#xff0c;但其内核调度机制与中断处理能力难以满足微秒级硬实时要求。针对这一痛点&#xff0c;鸿道Int…

搭建Nexus前端npm私服,上传发布npm包和下载依赖

1、创建repository 登录Nexus的管理页面&#xff0c;创建npm&#xff08;proxy&#xff09;和npm&#xff08;hosted&#xff09;&#xff0c;然后创建npm&#xff08;group&#xff09;将这两个repository包含进来。 1.1 创建npm&#xff08;proxy&#xff09; 选择npm&…

数组总结【代码随想录】

一.数组 1.lc 27移除数组中的重复元素 且必须仅使用 O(1) 额外空间并 原地 修改输入数组。 输入&#xff1a;nums [3,2,2,3], val 3 输出&#xff1a;2, nums [2,2] 解释&#xff1a;函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长…

大模型训练——pycharm连接实验室服务器

一、引言 我们在运行或者复现大佬论文代码的时候&#xff0c;笔记本的算力不够&#xff0c;需要使用实验室的服务器进行运行。可以直接在服务器的终端上执行&#xff0c;但是这样的话代码调试就不方便。而我们可以使用 pycharm 连接到服务器&#xff0c;既方便了代码调试&…

STM32的C语言软件延时函数

STM32的延时方法很多&#xff0c;其中采用定时器延时&#xff0c;可以得到较为精确的延时&#xff0c;但是有时对延时精度要求不高的场合&#xff0c;采用软件延时&#xff0c;也是必须的。特别是在RTOS系统中&#xff0c;使用SysTick的普通计数模式对延迟进行管理&#xff0c;…

前端网页或者pwa如何实现只横屏显示,设备竖着的时候依然保持横屏

开发的时候&#xff0c;就是以横屏的样式开发的&#xff0c;所以横屏的展示效果就是&#xff1a; 当设备竖着的时候&#xff0c;会进行缩放&#xff0c;展示效果不友好&#xff0c;所以需要设备竖着的时候&#xff0c;也横屏显示&#xff1a; 实现原理就是&#xff1a;使用css监…

计算机毕业设计SpringBoot+Vue.js电影评论网站系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Locale+Jackson导致Controller接口StackOverflowError异常解决

问题 由于参与的项目有出海需求&#xff0c;即需要给外国人使用&#xff0c;即&#xff1a;需要支持i18n&#xff08;Internationalization的缩写&#xff0c;共20个字母&#xff0c;除去首尾两个字母&#xff0c;中间有18个&#xff0c;故简称i18n&#xff09;。 本来是好的…

Graph and GNN——图的表示与图神经网络的介绍与应用

Hi&#xff0c;大家好&#xff0c;我是半亩花海。细数日子已然有很长一段时间没有更新博客了&#xff0c;不是在忙东忙西&#xff0c;就是在玩这玩那&#xff0c;在家摆&#xff0c;在学校gap&#xff0c;无敌了。言归正传&#xff0c;今天暂且先进一步探索并整理一部分图神经网…

京准电钟:NTP精密时钟服务器在自动化系统中的作用

京准电钟&#xff1a;NTP精密时钟服务器在自动化系统中的作用 京准电钟&#xff1a;NTP精密时钟服务器在自动化系统中的作用 NTP精密时钟服务器在自动化系统中的作用非常重要&#xff0c;特别是在需要高精度时间同步的场景中。NTP能够提供毫秒级的时间同步精度&#xff0c;这…

Https解决了Http的哪些问题

部分内容来源&#xff1a;小林coding 详细解析 Http的风险 HTTP 由于是明文传输&#xff0c;所以安全上存在以下三个风险&#xff1a; 1.窃听风险 比如通信链路上可以获取通信内容&#xff0c;用户号容易没。 2.篡改风险 比如强制植入垃圾广告&#xff0c;视觉污染&#…

GO 进行编译时插桩,实现零码注入

Go 编译时插桩 Go 语言的编译时插桩是一种在编译阶段自动注入监控代码的技术&#xff0c;目的是在不修改业务代码的情况下&#xff0c;实现对应用程序的监控和追踪。 基本原理 Go 编译时插桩的核心思想是通过在编译过程中对源代码进行分析和修改&#xff0c;将监控代码注入到…

flex布局自定义一行几栏,靠左对齐===grid布局

模板 <div class"content"><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"item">1222</div><div class"…

微软推出Office免费版,限制诸多,只能编辑不能保存到本地

易采游戏网2月25日独家消息&#xff1a;微软宣布推出一款免费的Office版本&#xff0c;允许用户进行基础文档编辑操作&#xff0c;但限制颇多&#xff0c;其中最引人关注的是用户无法将文件保存到本地。这一举措引发了广泛讨论&#xff0c;业界人士对其背后的商业策略和用户体验…