FastAPI Web框架教程 第14章 部署

news2024/12/29 9:22:53

14-1 在Linux上安装Python

【环境】

  • 腾讯云服务器 Centos 8

【安装方式】

  • 源码编译安装

安装步骤

第1步:更新yum源

cd /etc/yum.repos.d/
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
yum clean all
yum update

# 安装编译依赖
yum install -y libffi-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel xz-devel
  • 第2步:从官网下载Python源码包(如果下载比较慢,也可以在本地下载好传到远程服务器上)
[root@VM-4-2-centos ~]# pwd
/root
[root@VM-4-2-centos ~]# wget https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tgz
  • 第3步:解压缩
[root@VM-4-2-centos ~]# tar -xzvf Python-3.10.4.tgz 
[root@VM-4-2-centos ~]# ls
Python-3.10.4  Python-3.10.4.tgz
  • 第4步:编译安装,–prefix指定安装目录
cd Python-3.10.4
./configure --prefix=/usr/local/bin/python310

make && make install
  • 第5步:创建软连接,创建软连接后才能在任何路径下使用命令(可选)
ln -s /usr/local/bin/python310/bin/python3.10 /usr/bin/python3.10
ln -s /usr/local/bin/python310/bin/pip3.10 /usr/bin/pip3.10

14-2 在Linux上部署Web项目

  • 开发完成的web项目可以在本地部署,部署方式:uvicorn main:app --host 127.0.0.1 --port 8080
  • 其中:–host指定部署在那个IP地址,–port表示服务监听的端口号。
  • 但是,本地的部署只能在本地自己访问,别人无法访问;想要让别人可以访问,需要将服务部署在公网上。
  • 比如,将web项目部署在阿里云服务器,腾讯云服务器上。

部署准备:

  • 准备云服务器一台,比如centos8(购买云服务器参考:https://www.51zxw.net/List.aspx?cid=972)
  • 如果不想使用云服务器,只想体验在linux上部署服务,可以使用虚拟机。
  • 远程连接工具,xshell、xftp等等。(课程素材中有提供)
  • web项目(简单演示)
# main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def index():
    return {"message": "Hello World"}

部署流程

  • 第1步:使用xshell连接远程服务器,进入/root(如果是root用户,进去后默认就是/root目录)

  • 第2步:在linux服务器上安装python3.10,安装项目的依赖,比如: fastapi、uvicorn等

  • 第3步:确保项目在本地可以跑起来,uvicorn main:app --host 127.0.0.1 --port 8080

  • 第4步:使用xftp将本地的main.py文件拷贝到远程服务器的 /root目录下

  • 第5步:使用命令启动服务,注意 --host这里不要使用 0.0.0.0,也不要使用公网IP

uvicorn main:app --host 0.0.0.0 --port 8080		# --host 0.0.0.0

# 如果上述命令报错,则需要添加环境变量
export PATH="/usr/local/bin/python310/bin:$PATH"
  • 第6步:在云服务器的管理页面的安全组或者防火墙,放行8080端口

  • 第7步:在本地浏览器,输入云服务器的公网IP:8080,然后回车, 即可访问服务

http://公网IP:8080

在这里插入图片描述

14-3 使用systemd部署

直接使用上述部署方式,是一种前台运行方式,一旦退出shell,则服务就挂掉了,因此我们需要使用一种后台运行的方式。

本节课,给大家接收一种常用的后台运行方式,即使用systemd部署服务。

部署流程

  • 第一步:创建服务
cd /etc/systemd/system/

vim simple_app.service 			# 新建名为 simple_app.service的文件, 将并将下面的内容拷贝进去然后保存退出


[Unit]
Description=Simple app Service                                                                                  

[Service]
Type=oneshot
ExecStart=/usr/local/bin/python310/bin/python3.10 /root/main.py
StandardOutput=syslog
StandardError=inherit

[Install]
WantedBy=multi-user.target
  • 第二步:调整代码
# /root/main.py
import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def index():
    return {"message": "Hello World"}

uvicorn.run(app, host="0.0.0.0", port=8080)
  • 开启服务
systemctl enable simple_app.service
  • 启动服务
systemctl start simple_app.service
  • 关闭服务
systemctl stop simple_app.service
  • 查看运行状态
systemctl status simple_app.service

14-4 使用docker部署

使用systemd部署其实已经非常好的管理服务了,但是你会发现它依赖本地环境,比如依赖本地Pyhton解释器等等。

如果想要一个完全独立的运行环境,我们可以使用容器化的方式部署我们的服务。

这节课,我们就来看下如何使用Docker的方式部署服务。

还是针对这个简单的服务

# /root/main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def index():
    return {"message": "Hello World"}

部署前提,安装好docker,参考安装视频:https://www.51zxw.net/Show.aspx?cid=972&id=111447

使用Docker部署流程

  • 第1步,调整项目结构
- docker_app
	|- main.py				# fastapi的服务
	|- requirements.txt		 # 项目依赖,比如 fastapi/uvicorn等
  • 第2步:生成 requirements.txt
pip3.10 freeze > ./requirements.txt
  • 第3步:编写Dockerfile

    FROM python:3.10-slim
    
    COPY . /var/www/src
    WORKDIR /var/www/src
    
    RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
    
    CMD ["/usr/local/bin/uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]
    
  • 第4步:构建镜像

docker build -t docker_app:v1.0 .
  • 第5步:运行容器
docker images

docker run -d --rm -p8080:8080 镜像id

【提示:使用容器部署时记得先把上节课的 systemd部署的服务关了,避免都是8080端口冲突了】

14-5 使用docker-compose单机部署

  • 使用docker可以方便的部署我们的服务,并且可以做到相对环境隔离。

  • 不过你可能会遇到以下场景:

    • 一个web服务需要依赖mysql数据库
    • 此时如果使用docker的部署方式,那我们即需要一个一个的部署三个容器
    • 并且,因为是容器化部署,所以每次新建容器的Ip地址都是变化的,那web容器如何连接mysql容器?
    • 此时,我们就需要一个容器编排工具,而docker-compose就是一个官方推荐的单机编排工具。

前提:在服务器上安装好docker-compose,参考视频:https://www.51zxw.net/Show.aspx?cid=972&id=111532

准备项目

  • 为了显示出docker-compose的容器编排功能,我们以 第十章整理的blog_app项目为例。

docker-compose部署项目流程

  • 第一步:准备好requirements.txt 【参考上节课】
  • 第二步:编写 Dockerfile 【参考上节课】
  • 第三步:编写docker-compose.yml
version: "3.9"
services:
  mysql:
    image: percona:5.7
    environment:
      MYSQL_DATABASE: app
      MYSQL_USER: app
      MYSQL_PASSWORD: app
      MYSQL_ROOT_PASSWORD: app
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  web:
    build: .
    volumes:
      - .:/var/www/src
    depends_on:
      - mysql
    command: sh -c "/usr/local/bin/uvicorn main:app --reload --host=0.0.0.0 --port=8080"
    ports:
      - "0.0.0.0:8080:8080"
  • 第四步:调整数据库连接
# darabase.py


import pymysql

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, Session

pymysql.install_as_MySQLdb()


# 根据docker-compose.yml中mysql的环境变量做如下修改:
# 用户名改为 app
# 密码改为 app
# 数据库IP改为 mysql
# 数据库名改为 app
DATABASE_URL = "mysql://app:app@mysql:3306/app"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(bind=engine)


def get_db():
    db: Session = SessionLocal()
    try:
        yield db
    finally:
        db.close()


  • 第五步:启动服务(内部会自动构建镜像和运行服务)
docker-compose up -d	# 启动服务
docker-compose ps        # 查看容器运行状态
docker-compose restart   # 重启服务
docker-compose stop		# 暂停服务
docker-compose down		# 彻底删除服务

【完整代码见课程素材】

  • 注意:因为没有在数据库中创建表,所以接口调用时会报错。

r(bind=engine)

def get_db():
db: Session = SessionLocal()
try:
yield db
finally:
db.close()




- 第五步:启动服务(内部会自动构建镜像和运行服务)

```bash
docker-compose up -d	# 启动服务
docker-compose ps        # 查看容器运行状态
docker-compose restart   # 重启服务
docker-compose stop		# 暂停服务
docker-compose down		# 彻底删除服务
```



【完整代码见课程素材】

- 注意:因为没有在数据库中创建表,所以接口调用时会报错。





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1563998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SV学习笔记(一)

SV:SystemVerilog 开启SV之路 数据类型 內建数据类型 四状态与双状态 : 四状态指0、1、X、Z,包括logic、integer、 reg、 wire。双状态指0、1,包括bit、byte、 shortint、int、longint。 有符号与无符号 : 有符号&am…

ObjectiveC-03-XCode的使用和基础数据类型

本节做为Objective-C的入门课程,笔者会从零基础开始介绍这种程序设计语言的各个方面。 术语 ObjeC:Objective-C的简称,因为完整的名称过长,后续会经缩写来代替;项目/工程:也称工程,指的是一个A…

记某客户的一次无缝数据迁移

背景 客户需要将 Elasticsearch 集群无缝迁移到移动云,迁移过程要保证业务的最小停机时间。 实现方式 通过采用成熟的 INFINI 网关来进行数据的双写,在集群的切换恢复过程中来记录数据变更,待全量数据恢复之后再追平后面增量数据&#xff…

Node.js------Express

◆ 能够使用 express.static( ) 快 速 托 管 静 态 资 源◆ 能够使用 express 路 由 精 简 项 目 结 构◆ 能够使用常见的 express 中间件◆ 能够使用 express 创建API接口◆ 能够在 express 中启用cors跨域资源共享 一.初识Express 1.Express 简介 官方给出的概念&#xff…

Discuz! X3.5苗木_苗木网_苗木价格_苗木求购信息_苗木批发网模板utf-8

适合做苗木行业平台苗木网站、苗木信息网,提供苗木报价、各地苗木求购信息、绿化苗木采购招标、苗木基地展示、苗木百科知识、花木交易及苗木资讯、各地苗木信息网络行情。解压上传到template目录下,后台安装即可,包含PC手机端模板 下载地址:…

Windows 上路由、端口转发配置,跨网络地址段

一、背景 有时候我们会遇到这样的场景,一批同一局域网中只有某一台主机带外且系统为windows,局域网中其他非带外的主机要想访问外网,本文将介绍如何配置在带外主机上开启路由及端口转发。 二、配置操作 2.1、带外主机开启路由转发 1&#x…

QA测试开发工程师面试题满分问答6: 如何判断接口功能正常?从QA的角度设计测试用例

判断接口功能是否正常的方法之一是设计并执行相关的测试用例。下面是从测试QA的角度设计接口测试用例的一些建议,包括功能、边界、异常、链路、上下游和并发等方面: 通过综合考虑这些测试维度,并设计相应的测试用例,可以更全面地评…

一文盘点Mendix在SAP之上的那些事儿

前言 近来接手了2个与SAP有关的低代码案子,客户都会问Mendix和SAP之间怎么回事。 2017年开始Mendix 成为SAP Endorsed APP级别合作伙伴,并再度升级为Solution Extension最高级别。 两家公司风雨同舟七载,服务的全球大客户不胜枚举。 商业…

【嵌入式智能产品开发实战】(十四)—— 政安晨:通过ARM-Linux掌握基本技能【链接静态库与动态库】

目录 链接静态库 动态链接 与地址无关的代码 全局偏移表 延迟绑定 共享库 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 嵌入式智能产品开发实战 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论…

穿什么有这么重要?--装饰模式

1.1 穿什么有这么重要? 约会穿什么? "那要看你想给人家什么印象?是比较年轻,还是比较干练;是比较颓废,还是要比较阳光;也有可能你想给人家一种极其难忘的印象,那穿法又大不一样…

算法错题本

这里写目录标题 错题本注意数据的耦合性对于无解情况的处理思路一组数据以0为结束标记,如何输入到数组中,并计数多个数据进行比较链表删除重复元素的启发循环体里谨慎写类型定义并初始化(一般写上就是错)队列中读取队尾元素数组当…

基于ssm的三省学堂-学习辅助系统(java项目+文档+源码)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的三省学堂-学习辅助系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 三省学堂-学习辅助系统的…

深入理解数据结构第二弹——二叉树(2)——堆排序及其时间复杂度

看这篇前请先把我上一篇了解一下:深入理解数据结构第一弹——二叉树(1)——堆-CSDN博客 前言: 相信很多学习数据结构的人,都会遇到一种情况,就是明明最一开始学习就学习了时间复杂度,但是在后期…

回顾快速排序

快速排序 快速排序的核心: 找到一个key 通常左边的数比key小,右边的数比key大。 找key通常有三种方法: 1. 挖坑法: 代码实现: // int _pivot(int* a, int left, int right) {int begin left, end right;int in…

开源AGV调度系统OpenTCS中的任务分派器(dispatcher)详解

OpenTCS中的任务分派器dispatcher详解 1. 引言2. 任务分派器(dispatcher)2.1 默认的停车位置选择2.2 可选停车位置属性2.3 默认的充电位置选择2.4 即时运输订单分配 3. 默认任务分派器的配置项4. 参考资料与源码 1. 引言 openTCS是一项著名的开源运输控制系统,我在…

Go 源码之 Chan

Go 源码之 chan go源码之chan - Jxy 博客 目录 Go 源码之 chan一、总结二、源码(一)hchan(二)创建(三)发送(四)接收(五)关闭 三、常见问题1.为什么要使用环形…

[Linux] 排查问题指令top/ps/netstat

在Linux下查看某个端口运行的指令 1. 首先通过netstat来查看端口对应的进程号 比如抓取端口53这个DNS服务的进程 netstat -tulnp | grep 53 可以看到53这个端口号对应的pid是720 2. 通过ps指令来对进程号执行的命令查询 ps aux | grep 720 可以看到pid为720这个进程对应的执…

Android APP代码混淆技术解析与实战指南

Android APP 加固是优化 APK 安全性的一种方法,常见的加固方式有混淆代码、加壳、数据加密、动态加载等。下面介绍一下 Android APP 加固的具体实现方式。 混淆代码 使用 ipaguard工具可以对代码进行混淆,使得反编译出来的代码很难阅读和理解&#xff…

【中文视觉语言模型+本地部署 】23.08 阿里Qwen-VL:能对图片理解、定位物体、读取文字的视觉语言模型 (推理最低12G显存+)

项目主页:https://github.com/QwenLM/Qwen-VL 通义前问网页在线使用——(文本问答,图片理解,文档解析):https://tongyi.aliyun.com/qianwen/ 论文v3. : 一个全能的视觉语言模型 23.10 Qwen-VL: A Versatile…

CentOS7安装Flink1.17伪分布式

前提条件 拥有1台CentOS7 CentOS7安装好jdk,官方文档要求java 11,使用java 8也可以。可参考 CentOS7安装jdk8 下载安装包 下载安装包 [hadoopnode1 ~]$ cd installfile/ [hadoopnode1 installfile]$ wget https://archive.apache.org/dist/flink/flin…