FastAPI Web框架教程 第14章 部署

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		# 彻底删除服务
```



【完整代码见课程素材】

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





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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RESTful的优点

优点 1.通过url对资源定位,语义清晰; 2.通过HTTP谓词表示不同的操作,接口自描述; 3.可以对GET、PUT、DELETE请求重试(幂等的); 4.可以对GET请求做缓存; 5.通过HTTP状态码反映服务器端…

【数据结构】AVL 树

文章目录 1. AVL 树的概念2. AVL 树节点的定义3. AVL 树的插入4. AVL 树的旋转5. AVL 树的验证6. AVL 树的删除7. AVL 树的性能 前面对 map / multimap / set / multiset 进行了简单的介绍【C】map & set,在其文档介绍中发现,这几个容器有个共同点是…

Java面试必问题24:线程池的拒绝策略有哪些 synchronized 和 lock 的区别 (重点)

以上列出的是Java线程池中常见的拒绝策略,具体可以根据实际情况选择合适的拒绝策略,也可以自定义实现RejectedExecutionHandler接口来定义自己的拒绝策略。默认的拒绝策略是AbortPolicy,即直接抛出异常。 最简回答:线程池的拒绝策…

6000000IOPS!FASS×kunpeng920全新突破

实测数据详见下文 网络环境 前端和后端网均采用100GE网络,管理网采用1Gbps以太网。 前端网和后端网通过不同网段隔离,与管理网物理隔离。 软硬件配置 存储端配置: 客户端配置: 软件配置: 存储集群配置: …

EasyExcel 复杂表头的导出(动态表头和静态表头)

问题:如图,1部分的表头是动态的根据日期变化,2部分是数据库对应的字段,静态不变的; 解决方案:如果不看1的部分,2部分内容可以根据实体类注解的方式导出,那么我们是不是可以先将动态表…

选精益制造咨询公司,牢记这几点,轻松避开陷阱!

众所周知,选择一家合适的精益制造咨询公司,可以帮助企业实现转型升级,提升生产效率和市场竞争力。然而,市场上的咨询公司众多,如何选择一家真正专业、有实力的公司,避免踩坑呢? 一、看准公司背景…

MCU友好过渡MPU,米尔基于STM32MP135开发板裸机开发应用笔记

以前微处理器(MPU)与微控制器(MCU)是截然不同的两种设备,MPU支持丰富的软件系统,如Linux和相关的软件堆栈,而MCU通常将专注于裸机和RTOS。近年来,随着MCU的性能越来越高,…

前端二维码生成工具小程序:构建营销神器的技术解析

摘要: 随着数字化营销的不断深入,二维码作为一种快速、便捷的信息传递方式,已经广泛应用于各个领域。本文旨在探讨如何通过前端技术构建一个功能丰富、操作简便的二维码生成工具小程序,为企业和个人提供高效的营销支持。 一、引言…

数字化助力乡村振兴:数字乡村展现新活力

目录 一、数字乡村的概念与内涵 二、数字化助力乡村振兴的具体表现 1、促进农村产业升级 2、提升农民生活质量 3、优化农村治理体系 三、数字乡村展现的新活力 1、创新发展模式的活力 2、激发农民内生动力的活力 3、提升乡村整体形象的活力 四、数字乡村发展面临的挑…

记一次Cannot deploy POJO class [xxx$$EnhancerBySpringCGLIB$$xxx]的错误

最近项目上需要使用websocket做服务端&#xff0c;那好说啊&#xff0c;直接springboot集成的websocket 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><versi…

Linux_进程通信_管道_system V共享内存_6

文章目录 一、进程通信分类二、管道1.什么是管道1.原理2.管道的特点 2.匿名管道3.命名管道1.创建命名管道文件 - mkfifo (命令)2.创建命名管道文件 - mkfifo (函数) 三、system V共享内存1.原理2.共享内存函数1.fotk2.shmget1.如何知道有哪些IPC资源 - ipcs &#xff08;命令&a…

k8s笔记28--快速在ubuntu上基于二进制和源码安装containerd

k8s笔记28--快速在ubuntu上基于二进制和源码安装containerd 介绍containerd 安装方法二进制文件安装源码构建安装 注意事项说明 介绍 Containerd是一个工业标准的容器运行时&#xff0c;它强调简单、健壮和可移植性。它可作为Linux和Windows的守护进程&#xff0c;能管理主机系…

Day78:服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE漏洞

目录 前置知识 数据库应用-Redis-未授权访问&CVE漏洞 未授权访问&#xff1a;CNVD-2015-07557 未授权访问-CNVD-2019-21763 未授权访问-沙箱绕过RCE-CVE-2022-0543 数据库应用-Couchdb-未授权越权&CVE漏洞 Couchdb 垂直权限绕过&#xff08;CVE-2017-12635&…

怎么倒放视频教程?3个简单易行方法分享

怎么倒放视频教程&#xff1f;视频倒放是一种创意性的视频编辑方式&#xff0c;通过倒序播放视频内容&#xff0c;可以为观众带来全新的视觉体验。无论是为了制作搞笑视频&#xff0c;还是为了创作具有艺术感的短片&#xff0c;倒放视频都是一个非常实用的技巧。同时&#xff0…

数学矩阵(详解)

矩阵乘法 知阵乘法是《线性代数》中的基础内容&#xff0c;但在考察数学的算法题中也会出现。 本节我们学习基础的矩阵乘法规则。 每个矩阵会有一个行数和一个列数&#xff0c;只有当相乘的两个矩阵的左矩阵的列数等于右矩阵的行数 时&#xff0c;才能相乘&#xff0c;否则不允…

【计算机毕业设计】黄河交通学院教学质量评价系统的设计与实现(付系统源码)

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

跑步用什么运动耳机?推荐几款跑步时超好用的运动耳机

跑步健身成为了很多都市白领喜欢的运动方式之一&#xff0c;而为专业运动健身领域设计的运动耳机&#xff0c;近年来也受到了越来越多运动爱好者和数码爱好者的关注。相比于传统蓝牙耳机&#xff0c;运动耳机在运动过程中带给用户更舒适和安全的使用体验&#xff0c;因此也受到…

什么是AIGC,AIGC的应用领域有哪些,以及对AIGC的未来展望有什么值得关注的方向

AIGC:人工智能生成内容的深度解析 在数字技术的浪潮中,AIGC(ArtificialIntelligenceGeneratedContent,人工智能生成内容)逐渐崭露头角,成为继专业生产内容(PGC)和用户生产内容(UGC)之后的新型内容创作方式。它不仅改变了内容生产的传统模式,更在多个行业中展现出…

钉钉服务端API报错 43008 参数需要multipart类型

钉钉服务端API报错 43008 参数需要multipart类型 problem 使用媒体文件上传接口&#xff0c;按照文档输入参数&#xff0c;结果返回报错 # 参数 {"access_token": "xxx""type": "image","media": "/Users/xxx/xxx/s…

mongodb sharding分片模式的集群数据库,日志治理缺失导致写入数据库报错MongoWriteConcernException的问题总结(下)

一、接着上文 上文介绍了mongodb sharding的分片集群搭建&#xff0c;本文侧重于讲述日志治理。 这里使用linux自带的日志治理工具logrotate&#xff0c;无论是哪个端口的进程&#xff0c;其日志治理方式类似。 查看/data目录下的文件大小&#xff0c; du -hs *二、Logrota…