当前位置:   article > 正文

fastApi 项目部署_fastapi 部署

fastapi 部署

方式一,Uvicorn部署

Run a Server Manually - Uvicorn - FastAPI

      1,linux服务器安装 python>3.8

      2,安装 uvicorn :                

 pip install "uvicorn[standard]"

      3,上传项目到服务器

            main.py

  1. from typing import Union
  2. from fastapi import FastAPI
  3. import uvicorn
  4. app = FastAPI()
  5. '''
  6. 启动命令
  7. uvicorn main:app --reload --port 8000
  8. #导出依赖
  9. pip freeze >requirements.txt
  10. api文档地址
  11. http://localhost:8080/docs
  12. 参数类型:
  13. 请求正文(body)+路径参数({})+查询参数(?&)
  14. '''
  15. @app.get("/")
  16. async def root():
  17. return {"message": "Hello World"}
  18. @app.get("/items/{item_id}")
  19. def read_item(item_id: int, q: Union[str, None] = None):
  20. return {"item_id": item_id, "q": q}
  21. # 第二种启动方式:
  22. if __name__ == '__main__':
  23. uvicorn.run(app="main:app", host="localhost", port=8000)

      4,启动服务:                

  1. uvicorn main:app --host 0.0.0.0 --port 8080
  2. # 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,启动服务: 

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

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

        3,停止服务

        查找进程: ps -ef|grep 进程名

        杀死进程: kill -s 9 进程号

  1. ps -ef|grep Uvicorn
  2. ps -ef|grep Gunicorn

方式三,docker 容器

FastAPI in Containers - Docker - FastAPI

        1,项目目录

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

        2,Dockerfile

  1. #
  2. FROM python:3.9
  3. # 设置工作目录
  4. WORKDIR /code
  5. # copy文件到容器
  6. COPY ./requirements.txt /code/requirements.txt
  7. # 创建日志目录
  8. RUN mkdir -p /log
  9. #
  10. RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
  11. #
  12. COPY ./app /code/app
  13. # 启动命令
  14. CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
  15. # 使用nginx代理请求头
  16. #CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]

        3,制作镜像

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

        4,运行容器

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

        5,测试项目

方式四,虚拟环境运行

        持续更新。。。

git +docker +  bash 持续集成

       1, 项目目录

        2,服务器安装git、docker

         

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

                运行脚本 : ./startweb.sh

  1. #!/bin/bash
  2. image_name='apiimage'
  3. contrainer_name='apiproject'
  4. git_url='https://gitee.com/daixxxxx/apidemo.git'
  5. project_name='apidemo'
  6. prot=900
  7. if [ ! -d "./${project_name}/" ];then
  8. echo "项目目录不存在"
  9. # 克隆代码
  10. git clone ${git_url}
  11. # 进入项目目录
  12. cd ${project_name}
  13. # 制作镜像 apiimage:镜像名
  14. docker build -t ${image_name} .
  15. # 运行容器 apidemo:容器名
  16. docker run -v /usr/local/web/apilog:/log \
  17. -d --name ${contrainer_name} -p ${prot}:80 ${image_name}
  18. else
  19. echo "项目已经存在"
  20. # 进入dockerfile所在目录
  21. cd ./${project_name}
  22. # 拉取最新代码
  23. git pull ${git_url}
  24. # 停止apidemo容器
  25. docker stop ${contrainer_name}
  26. # 删除容器
  27. docker rm ${contrainer_name}
  28. # 制作镜像
  29. docker build -t ${image_name} .
  30. # 运行容器 apidemo:容器名
  31. docker run -v /usr/local/web/apilog:/log \
  32. -d --name ${contrainer_name} -p ${prot}:80 ${image_name}
  33. fi
  34. # 检查容器运行状态
  35. status=$(docker inspect --format='{{.State.Status}}' "$contrainer_name")
  36. if [ "$status" = "running" ];then
  37. echo "项目部署成功"
  38. else
  39. echo "项目部署失败"
  40. fi

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

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

        5,停止项目        

  1. # 停止容器apiproject
  2. docker stop apiproject

Jenkins 持续集成

        持续更新。。。

k8s 持续集成

        持续更新。。。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/1015011
推荐阅读
  

闽ICP备14008679号