fastApi 项目部署

方式一,Uvicorn部署

Run a Server Manually - Uvicorn - FastAPI

      1,linux服务器安装 python>3.8

      2,安装 uvicorn :                

 pip install "uvicorn[standard]"

      3,上传项目到服务器

            main.py

from typing import Union
from fastapi import FastAPI
import uvicornapp = FastAPI()
'''
启动命令
uvicorn main:app --reload --port 8000#导出依赖
pip freeze >requirements.txtapi文档地址
http://localhost:8080/docs参数类型:
请求正文(body)+路径参数({})+查询参数(?&)
'''@app.get("/")
async def root():return {"message": "Hello World"}@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):return {"item_id": item_id, "q": q}# 第二种启动方式:
if __name__ == '__main__':uvicorn.run(app="main:app", host="localhost", port=8000)

      4,启动服务:                

uvicorn main:app --host 0.0.0.0 --port 8080# uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4  # 启动4个进程

                main 是项目启动文件main.py

                app是main.py里的FastAPI对象(app = FastAPI() )

                允许所有ip连接:--host 0.0.0.0

                项目启动在8080端口 : --port 8080

                远程连接一断开服务会停止

方式二, Gunicorn 和 Uvicorn

Server Workers - Gunicorn with Uvicorn - FastAPI

            Gunicorn将充当进程管理器,监听端口和IP。它会将通信传输到运行Uvicorn类的工作进程。Uvicorn将负责将Gunicornn发送的数据转换为FastAPI使用的ASGI标准。

        1,安装Gunicorn 和 Uvicorn         

pip install "uvicorn[standard]" gunicorn

        2,启动服务: 

gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000# -workers:要使用的worker进程的数量,每个进程将运行一个Uvicorn worker,在本例中为4个worker。
# 导入uvicon.workers.UvicornWorker
# --bind:这个命令告诉Gunicorn要监听的IP和端口,使用冒号(:)分隔IP和端口
# Gunicorn还将负责管理失效流程,并在需要时重新启动新流程,以保持进程数量。

          这种启动方式远程连接断开不会停止服务

        3,停止服务

        查找进程  >> kill 进程

ps -ef|grep Uvicorn
ps -ef|grep Gunicorn

方式三,docker 容器

FastAPI in Containers - Docker - FastAPI

        1,项目目录

                 .
                ├── app
                │   ├── __init__.py
                │   └── main.py
                ├── Dockerfile
                └── requirements.txt

        2,Dockerfile

#
FROM python:3.9# 设置工作目录
WORKDIR /code# copy文件到容器
COPY ./requirements.txt /code/requirements.txt#
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt#
COPY ./app /code/app# 启动命令
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]# 使用nginx代理请求头
#CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]

        3,制作镜像

# cd 到Dockerfile文件所在目录docker build -t myimage .

        4,运行容器

docker run -d --name mycontainer -p 800:80 myimage# -p:端口映射 宿主机端口:容器端口

        5,测试项目

方式四,虚拟环境运行

        持续更新。。。

git +docker +  bash 持续集成

       1, 项目目录

        2,服务器安装git、docker

         

        3,项目父目录放一个脚本文件 startweb.sh

                运行脚本 : ./startweb.sh

#!/bin/bashimage_name='apiimage'
contrainer_name='apiproject'
git_url='https://gitee.com/daixxxxx/apidemo.git'
project_name='apidemo'
prot=900if [ ! -d "./${project_name}/" ];thenecho "项目目录不存在"# 克隆代码git clone ${git_url}# 进入项目目录cd ${project_name}# 制作镜像 apiimage:镜像名docker build -t ${image_name} .# 运行容器  apidemo:容器名docker run -d --name ${contrainer_name} -p ${prot}:80 ${image_name} elseecho "项目已经存在"# 进入dockerfile所在目录cd ./${project_name}# 拉取最新代码git pull ${git_url}# 停止apidemo容器docker stop ${contrainer_name}# 删除容器docker rm ${contrainer_name}# 制作镜像docker build -t ${image_name} .# 运行容器docker run -d --name ${contrainer_name} -p ${prot}:80 ${image_name}
fi

        4 ,后续持续集成:提交代码 >> 运行脚本startweb.sh

# cd 到脚本目录
./startweb.sh

        5,停止项目        

# 停止容器apiproject
docker stop apiproject

Jenkins 持续集成

        持续更新。。。

k8s 持续集成

        持续更新。。。

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

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

相关文章

「实验记录」CS144 Lab1 StreamReassembler

目录 一、Motivation二、SolutionsS1 - StreamReassembler的对外接口S2 - push_substring序列写入ByteStream 三、Result四、My Code五、Reference 一、Motivation 我们都知道 TCP 是基于字节流的传输方式,即 Receiver 收到的数据应该和 Sender 发送的数据是一样的…

.NET进阶篇06-async异步、thread多线程2

知识须要不断积累、总结和沉淀,思考和写做是成长的催化剂web 内容目录 1、线程Thread 一、生命周期 二、后台线程 三、静态方法 1.线程本地存储 2.内存栅栏 四、返回值 2、线程池ThreadPool 一、工做队列 二、工做线程和IO线程 三、和Thread区别 四、定时器 1、线…

概率的 50 个具有挑战性的问题 [8/50]:完美的桥牌

一、说明 我最近对与概率有关的问题产生了兴趣。我偶然读到了弗雷德里克莫斯特勒(Frederick Mosteller)的《概率论中的五十个具有挑战性的问题与解决方案》)一书。我认为创建一个系列来讨论这些可能作为面试问题出现的迷人问题会很有趣。每篇…

【Redis-03】Redis数据结构与对象原理 -下篇

承接上篇【Redis-02】Redis数据结构与对象原理 -上篇 8. type-字符串string 8.1 字符串的三种encoding编码(int embstr raw) 如果保存的是整型,并且可以用long类型标识(-9223372036854775808到9223372036854775807&#xff09…

怎么挑选猫粮?挑选主食冻干猫粮的步骤

各位铲屎官都知道猫天性是食肉动物,无肉不欢的。而冻干猫粮对于猫咪来说是最好还原猫咪食肉天性的食物,不仅可以当成猫咪的主食,也可以用来给猫咪当成零食,帮助猫咪补充营养。冻干猫粮是经过真空冷冻干燥处理的鲜肉,能…

菜鸟网络Java实习一面面经

自我介绍,做过的项目 巴拉巴拉 你项目中用到redis,可以介绍一下为什么使用它吗? 基于内存操作,内存读写速度快。 支持多种数据类型,包括String、Hash、List、Set、ZSet等。 支持持久化。Redis支持RDB和AOF两种持久…

探索 Vue 异步组件的世界:解锁高效开发的秘密(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Vue-Setup

一、setup概述 小小提示&#xff1a;vue3中可以写多个根标签。 Person.vue中内容 <template><div class"person"><h2>姓名&#xff1a;{{name}}</h2><h2>年龄&#xff1a;{{age}}</h2><!--定义了一个事件&#xff0c;点击这…

SpringCloud 和 Linux 八股文第三期五问五答

SpringCloud 和 Linux 八股文第三期五问五答 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;Linux常用命令 2&#xff09;如何查看测试项目的日志 一…

docker搭建minio集群,集群分享文件URL踩坑问题

一、环境准备 3台机器&#xff0c;Ip地址依次为IP1,IP2,IP3二、设置服务器时间同步 Minio集群需要各个节点的时间保持同步&#xff0c;使用NTP作为时间同步服务&#xff0c;这里以Minio-1&#xff08;IP1&#xff09;为上游服务器&#xff0c;其它2个节点为下游服务器&#x…

【YOLO系列】yolo V1 ,V3,V5,V8 解释

文章目录 yolo V1 模型结构图通道数 的 物理意义是什么&#xff1f;输出 7730 怎么理解&#xff1f;YOLO v1 损失函数LOSS yolo V3yolo V5yolo V8 视频来源&#xff1a;https://www.bilibili.com/video/BV13K411t7Zs/ AI视频小助理 一、YOLO系列的目标检测算法&#xff0c;其中…

idea 出现Cannot resolve symbol ‘springframework‘解决方法

Maven手动重新加载 1&#xff09;File–>Invalidate Caches / Restart… 清理缓存&#xff0c;重启idea客户端 2&#xff09;File–>Maven–>Reload project重新从maven中加载工程依赖的组件