当前位置: 首页 > news >正文

将 FastAPI 部署到生产服务器(一套 全)

将 FastAPI 部署到生产服务器(全)

文章目录

  • 将 FastAPI 部署到生产服务器(全)
  • 一、前言
  • 二、Fastapi项目 生产环境配置
    • 1. 准备环境
    • 2. 编写 FastAPI 应用
    • 3. 使用 Uvicorn 运行应用
    • 4. 配置生产级服务器 Gunicorn
      • 4.1 配置 Gunicorn 和 Uvicorn Workers
    • 5. 使用 Supervisor 管理应用
  • 三、加SSl证书配置https
    • 1、将域名解析到你的服务器
    • 2、验证该域名是否解析成功
    • 3、let's Encrypt 证书申请
      • (1)certbot安装
      • (2)let's Encrypt 证书申请
  • 四、配置nginx
    • 1、nginx安装
    • 2、配置nginx.conf
    • 3、重新运行nginx
  • 五、运行测试
    • 1、查看这个服务输出的日志
    • 2、访问网站

一、前言

未来的开发者们请上座。
以下是本次用到的FastAPI,Uvicorn,Gunicorn和Supervisor的简要介绍:

  1. FastAPI:FastAPI 是一个现代、快速(高性能)的 web 框架,用于构建 APIs,基于 Python 3.6+ 类型提示。主要特性包括:

    • 快速:非常高的性能,接近于 NodeJS 和 Go(由 Starlette 和 Pydantic 提供)。
    • 快速编码:提高开发速度约 200% 至 300%*。
    • 少出错:减少约 40% 的人为(开发者)错误。
    • 直观:优秀的编辑器支持,❤️ 的开发体验。
    • 易于使用:设计易于使用和学习,尽量减少开发时间。
    • 简洁:最小化代码复杂性,尽量减少开发者眼中的 bug。
    • 基于标准:基于(并完全兼容)开放标准:OpenAPI(以前称为 Swagger)和 JSON Schema。
    • Django 风格的 ORM:支持 Tortoise-ORM 和 Pydantic 模型。
  2. Uvicorn:Uvicorn 是一个基于 asyncio 的 ASGI 服务器,用于部署 Python 的异步 web 应用,它的目标是成为 Python 异步服务器网关接口(ASGI)规范的最快实现之一。Uvicorn 支持 HTTP/1.1 和 WebSockets,并且可以配合像 Starlette 和 FastAPI 这样的框架使用。

  3. Gunicorn:Gunicorn ‘Green Unicorn’ 是一个 Python WSGI HTTP 服务器,用于 UNIX。它是 Ruby 的 Unicorn 服务器的 Python 移植版。Gunicorn 的工作模式是预先分叉出多个进程来处理请求,这使得它在处理并发请求时具有较高的效率。然而,由于它基于同步的 WSGI,因此在处理 WebSockets 或长连接时可能不如 Uvicorn 高效。

  4. Supervisor:Supervisor 是一个用 Python 开发的进程管理工具,可以很方便的用来在 UNIX-like 系统(不支持 Windows)下启动、重启(自动)和关闭进程(程序)。除了对单个进程的管理外,还可以同时启动、关闭多个进程,实现对程序的批量管理。Supervisor 通常被用于管理服务器上的后台程序。

每个工具都有其特定的用途:FastAPI 用于构建 API,Uvicorn 和 Gunicorn 用于部署应用,而 Supervisor 用于进程管理。在 Python 的 web 开发中,这些工具经常一起使用。

二、Fastapi项目 生产环境配置

1. 准备环境

  • 操作系统:建议使用 Ubuntu、Debian 或 CentOS 等服务器操作系统。
  • Python 环境:安装 Python 3.7+,并创建虚拟环境来隔离项目依赖。
    sudo apt update
    sudo apt install python3 python3-venv python3-pip -y
    python3 -m venv venv
    source venv/bin/activate
    pip install fastapi uvicorn
    

2. 编写 FastAPI 应用

确保你的 FastAPI 应用文件(如 app.py)结构清晰。例如:

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddlewareapp = FastAPI(root_path="/aiCentre") # aicentre为nginx中api路由名
# 启用CORS支持
app.add_middleware(CORSMiddleware,allow_origins=["*"],allow_credentials=True,allow_methods=["*"], # 或者只列出 ["POST", "GET", "OPTIONS", ...] 等allow_headers=["*"],
)
# 路由
@app.get("/")
async def read_root():return {"message": "Welcome to FastAPI!"}

注:nginx.conf中后端配置参考如下如下,注意root_path和路由要一致。
在这里插入图片描述


3. 使用 Uvicorn 运行应用

先在开发环境测试运行:

uvicorn app:app --host 0.0.0.0 --port 8000

访问 http://<你的服务器IP>:8000,确认应用正常。


4. 配置生产级服务器 Gunicorn

生产环境通常需要使用反向代理(如 Nginx)和进程管理器(如 Gunicorn 、 Supervisor)。

4.1 配置 Gunicorn 和 Uvicorn Workers

安装 Gunicorn,并配置多进程支持:

pip install gunicorn uvicorn
gunicorn app:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000

访问 http://<你的服务器IP>:8000,确认应用正常,Gunicorn正常运行。

  • -w 4:指定 4 个工作进程。
  • -k uvicorn.workers.UvicornWorker:使用 Uvicorn Worker。
  • app:app,第一个app是python文件名,第二个是FastAPI的实例化的对象名。

5. 使用 Supervisor 管理应用

为确保应用在服务器重启后自动运行,可以使用 Supervisor。

  1. 安装 Supervisor:
    sudo apt install supervisor -y
    
  2. 创建配置文件 /etc/supervisor/conf.d/fastapi.conf
    [program:fastapi]
    command=/path/to/venv/bin/gunicorn app:app -w 4 -k uvicorn.workers.UvicornWorker --bind 127.0.0.1:8000
    directory=/path/to/your/project
    user=youruser
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/fastapi.err.log
    stdout_logfile=/var/log/fastapi.out.log
    
  3. 启用配置并启动:
    sudo supervisorctl reread
    sudo supervisorctl update
    sudo supervisorctl start fastapi
    

注1:每一次更改都需要都执行一遍。

注2:fastapi这个要求是文件名fastapi.conf 和 [program:fastapi]一致,可以更换为你的


三、加SSl证书配置https

前置条件:我默认你已经有域名了,如果没有需要在国内的阿里云、腾讯云、华为云,国外的Hostinger等云服务商都提供域名注册和域名解析服务。找一个你喜欢的就可以,在这里我用的是阿里云注册的域名进行演示。
(国内的域名需要提前备案,15天左右。如果比较着急且只是演示可以用香港或者国外如Hostinger 云服务厂商提供的域名这样可以免掉备案的步骤)

1、将域名解析到你的服务器

在这里插入图片描述

等待20s左右让其传播。

2、验证该域名是否解析成功

执行 nslookup + 域名,即可查询域名解析对象

nslookup bak.sligenai.cn

在这里插入图片描述
看到解析到你的公网服务器的ip就完成了

3、let’s Encrypt 证书申请

(1)certbot安装

我们需要安装Certbot并用于申请let’s Encrypt 。
打开终端,运行以下命令:

sudo apt update
sudo apt install certbot python3-certbot-nginx

(2)let’s Encrypt 证书申请

 sudo certbot --nginx -d bak.sligenai.cn

如果是第一次,可能会要你输入你的邮箱和让你输入A或Yes同意一些条款你按着输入就行。
在这里插入图片描述
然后就生成好证书了。记得保存好fullchain.pem和private.pem的路径,这个等下会用到。

下面是我的fullchain.pem和private.pem的路径
/etc/letsencrypt/live/bak.sligenai.cn/fullchain.pem
/etc/letsencrypt/live/bak.sligenai.cn/privkey.pem

fullchain.pemprivkey.pem这两个文件对于配置Web服务器以安全地提供服务是非常重要的。下面是这两个文件的详细说明:
fullchain.pem

  • 含义fullchain.pem文件包含了你的域名证书以及任何中间证书的完整链,但不包括根证书。这个文件是将你的证书(cert.pem)和中间证书(chain.pem)合并而成的。在大多数Web服务器的SSL配置中,使用这个文件可以确保客户端(如Web浏览器)能够信任你的证书,即能够通过证书链验证到达一个根CA,该根CA已被客户端信任。
  • 用途:在配置SSL/TLS时,fullchain.pem通常用于服务器配置中指定证书文件。例如,在Nginx中,会用它来设置ssl_certificate指令。

privkey.pem

  • 含义privkey.pem文件包含了你的私钥,这是在生成CSR(证书签名请求)时创建的。私钥是安全通信的基础,用于在SSL/TLS握手过程中对服务器端信息进行加密,确保只有对应的公钥(即你的服务器证书)能够解密。私钥必须保密,任何泄露都可能导致通信被解密。
  • 用途:在Web服务器的SSL配置中,privkey.pem用于设置私钥文件的位置。例如,在Nginx配置中,会用它来设置ssl_certificate_key指令。

总结

  • fullchain.pem:包含你的域名证书和中间证书的全部内容,用于服务器配置中指定证书链。
  • privkey.pem:包含你的私钥,用于服务器配置中指定私钥文件的位置。

在配置SSL/TLS时,确保正确使用这些文件,同时保护好你的私钥,避免安全风险。

注1:如果你没有开放443,80端口,申请的时候会报错
注2:如果你没有将域名解析到这个服务器的ip也会报错,会出现类似下面的回复。

在这里插入图片描述

四、配置nginx

1、nginx安装

sudo apt update
sudo apt install nginx

2、配置nginx.conf

打开nginx.conf

 vim /etc/nginx/nginx.conf

下面是一个nginx.conf模版

# nginx.conf
worker_processes auto; # 与worker_connections乘积表示实际处理事件的总数events {worker_connections 1024;  # 每个工作进程连接数
}http {include       mime.types;   # 文件扩展名与文件类型映射表default_type  application/octet-stream;client_max_body_size 10M;sendfile        on;            # 减少网络报文数量keepalive_timeout  65; # 链接超时时间,自动断开,如果为0则无限时长。# HTTP server配置(重定向到HTTPS)server {listen 80;  # 监听80端口server_name bak.sligenai.cn;             # 替换为你的域名return 301 https://$host$request_uri;  # 强制重定向到HTTPS}# HTTPS server配置server {listen 443 ssl;  # 监听443端口server_name bak.sligenai.cn;             # 替换为你的域名ssl_certificate /etc/letsencrypt/live/bak.sligenai.cn/fullchain.pem;          #替换为你的fuuchian.pemssl_certificate_key /etc/letsencrypt/live/bak.sligenai.cn/privkey.pem;    #替换为你的privkey.pemroot         /usr/share/nginx/html;location / {index index.html index.htm;rewrite / /login permanent; # 根据需求选择是否保留}location /vue-test {                              #替换为你的项目路由,注意需要一开头的base一致index index.html index.htm;try_files $uri $uri/ /vue-test/index.html;       #这个则是/路由/index.html 前面的部分一致不用动。   }location /abc {   #替换为请求拦截器中的baseURL的地址,如果没有后端则可以删掉这一部分add_header Cache-Control no-cache;add_header Pragma no-cache;add_header Expires 0;proxy_pass  http://localhost:3777/;   #后端地址}error_page  404  /404.html;  # 自定义404页面location = /404.html {internal;}error_page  500 502 503 504  /50x.html;  # 自定义500页面location = /50x.html {internal;}}}

注1:上面一共两个路由 /vue-test、 /abc ,分别为前端和后端。
注2:如果有多个项目则复制/vue-test 在旁边粘贴一个,改掉路由即可。
注3: 如果有其他域名,则额外把上面这个server复制一遍,即可。

3、重新运行nginx

在这里插入图片描述
检测nginx.conf是否配置正常

nginx -t

如果报错,则按照提示修改即可。

重新运行nginx

sudo systemctl reload nginx

五、运行测试

1、查看这个服务输出的日志

tail -f /var/log/gunicorn_stderr.log

在这里插入图片描述
服务正常。

2、访问网站

在这里插入图片描述
可以看到后端可以正常访问。
恭喜你,掌握了企业级 py后端的部署步骤。

相关文章:

将 FastAPI 部署到生产服务器(一套 全)

将 FastAPI 部署到生产服务器&#xff08;全&#xff09; 文章目录 将 FastAPI 部署到生产服务器&#xff08;全&#xff09;一、前言二、Fastapi项目 生产环境配置1. 准备环境2. 编写 FastAPI 应用3. 使用 Uvicorn 运行应用4. 配置生产级服务器 Gunicorn4.1 配置 Gunicorn 和 …...

题解 洛谷 Luogu P1873 [COCI 2011/2012 #5] EKO / 砍树 二分答案 C/C++

题目传送门&#xff1a; P1873 [COCI 2011/2012 #5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态https://www.luogu.com.cn/problem/P1873思路&#xff1a; 很简单的二分答案 每次找区间中点 m&#xff0c;判断以 m 为高度砍下的木头是否够 h 即可 代码&#xff1a; #defin…...

SpringCloud SaToken整合微服务 集成Redis 网关路由权限拦截 服务间内部调用鉴权

介绍 作为 API 网关&#xff0c;通常负责路由、负载均衡、安全控制等功能。进行 统一鉴权 的做法意味着将所有微服务的认证和授权逻辑集中到网关层&#xff0c;而不是每个微服务单独实现。这样做有许多好处&#xff0c;微服务只关心核心业务逻辑&#xff0c;不需要处理身份验证…...

Oracle ADB 导入 BANK_GRAPH 的学习数据

Oracle ADB 导入 BANK_GRAPH 的学习数据 1. 下载数据2. 导入数据运行 setconstraints.sql 1. 下载数据 访问 https://github.com/oracle-quickstart/oci-arch-graph/tree/main/terraform/scripts&#xff0c;下载&#xff0c; bank_accounts.csvbank_txns.csvsetconstraints.…...

优化 MFC CGridCtrl 的表格布局与功能

在使用 MFC 的 CGridCtrl 控件创建表格时&#xff0c;遇到的一个典型问题是&#xff0c;当表格滚动条出现时&#xff0c;最后一列会显示空白。这篇博客将记录解决这一问题的详细过程&#xff0c;同时总结了 CGridCtrl 初始化及优化的关键步骤&#xff0c;帮助开发者快速搭建一个…...

koa-body 的详细使用文档

目录 koa-body install Features Hello World - Quickstart Usage with koa-router Usage with unsupported text body type Options 关于 parsedMethods 的说明 文件支持 关于未解析请求主体的说明 一些强大的选择 使用总结 koa-body 功能齐全的 koa body 解析器中…...

信息系统与互联网中的安全、隐私及伦理问题

1 伦理&#xff08;Ethics&#xff09; 1.1 伦理框架&#xff08;Ethical Frameworks&#xff09; 自然法与权利&#xff08;Natural Law and Rights&#xff09; 定义&#xff1a;基于人类自然权利的伦理思想&#xff0c;强调生命、自由和财产等基本权利。应用&#xff1a;隐…...

Java安全—log4j日志FastJson序列化JNDI注入

前言 log4j和fastjson都是这几年比较火的组件&#xff0c;前者是用于日志输出后者则是用于数据转换&#xff0c;今天我们从源码来说一下这两个组件为何会造成漏洞。 实验环境 这里的idea要进行一下配置&#xff0c;因为我们要引用第三方组件&#xff0c;而这些第三方组件都是…...

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【DSP指令加速篇】

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【DSP指令加速篇】 一、前文回顾二、CMSIS-NN简介2.1 为什么介绍CMSIS-NN&#xff1f;2.2 CMSIS-NN是什么&#xff1f;2.3 CMSIS-NN核心特性2.4 CMSIS-NN算子支持 三、TFLMCMSIS-NN集成3.1 包含TFLM的STM32项目3.2 理解TFLM…...

Python中如何判断一串文本是不是数字

目录 1. 内置函数2. 尝试类型转换3. 正则表达式 在编程中&#xff0c;我们经常需要确定一段文本是否为数字。 这不仅关系到数据的准确性&#xff0c;还涉及到后续的计算和处理。 1. 内置函数 在Python中&#xff0c;可以使用str.isdigit()、str.isnumeric()和str.isdecimal()…...

基于YOLOv8深度学习的智慧农业山羊行为检测系统研究与实现(PyQt5界面+数据集+训练代码)

随着智慧农业的快速发展&#xff0c;利用先进的技术手段对牲畜的行为进行自动化监测和管理&#xff0c;已经成为现代农业中的重要研究方向之一。在传统的农业管理模式中&#xff0c;牲畜的行为监测通常依赖于人工观测&#xff0c;耗时耗力且难以实现大规模实时监控。然而&#…...

Redis环境部署(主从模式、哨兵模式、集群模式)

一、概述 REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统&#xff0c;是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库…...

高阶C语言之六:程序环境和预处理

本文介绍程序的环境&#xff0c;在Linux下对编译链接理解&#xff0c;较为简短&#xff0c;着重在于编译的步骤。 C的环境 在ANSI C&#xff08;标准C语言&#xff09;的任何一种实现中&#xff0c;存在两个不同的环境。 翻译环境&#xff1a;在这个环境中&#xff0c;源代码…...

Vue 3 国际化 (i18n) 最佳实践指南

1. 安装依赖 npm install vue-i18n@9 2. 项目结构建议 src/ ├── i18n/ │ ├── index.ts # i18n 配置文件 │ ├── languages/ # 语言文件目录 │ │ ├── zh-CN.ts # 中文 │ │ ├── en-US.ts # 英文 │ │ └─…...

Acme PHP - Let‘s Encrypt

Lets Encrypt是一个于2015年三季度推出的数字证书认证机构&#xff0c;旨在以自动化流程消除手动创建和安装证书的复杂流程&#xff0c;并推广使万维网服务器的加密连接无所不在&#xff0c;为安全网站提供免费的SSL/TLS证书。 使用PHP来更新证书&#xff1a; Acme PHP | Rob…...

获取DOM 节点的四大方式

前言&#xff1a; 在 Vue 中&#xff0c;获取 DOM 节点可以通过多种方式&#xff0c;如自定义属性、ref 引用、类选择器和 ID 选择器等。 一、使用 ref 获取 DOM 实例 ref 是 Vue 中推荐的获取 DOM 节点的方式&#xff0c;它为每个节点分配一个唯一的引用&#xff0c;可以直…...

ROS2 Humble 机器人建模和Gazebo仿真

一.Ubuntu22.04系统虚拟机安装 1.下载镜像并安装 Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2.安装选英文版&#xff0c;安装类型选清除磁盘。 3.遇到无法复制windows内容到虚拟机里。需安装VMware tools。VMware tools安装不了&a…...

docker容器镜像的制作、使用以及传递

目录 制作容器镜像使用Dockerfile制作镜像准备所需文件构建镜像怎么不使用基础镜像来构建容器镜像 使用容器镜像传递容器镜像 这篇文章讨论一下怎么使用docker制作容器镜像&#xff0c;容器镜像的使用&#xff0c;以及怎么传递容器镜像。 制作容器镜像 docker制作容器镜像推荐…...

一种由于吸入硅酸盐粉尘而引起的肺部疾病:pneumonoultramicroscopicsilicovolcanoconiosis

有人说&#xff0c;pneumonoultramicroscopicsilicovolcanoconiosis是英语中最长的单词&#xff0c;这是一个医学词汇&#xff0c;意思是指&#xff1a;一种由于吸入硅酸盐粉尘而引起的肺部疾病。 pneumonoultramicroscopicsilicovolcanoconiosis [ˈnju:mənəuˌʌltrəˌmai…...

百度AI人脸检测与对比

1.注册账号 打开网站 https://ai.baidu.com/ &#xff0c;注册百度账号并登录 2.创建应用 3.技术文档 https://ai.baidu.com/ai-doc/FACE/yk37c1u4t 4.Spring Boot简单集成测试 pom.xml 配置&#xff1a; <!--百度AI--> <dependency> <groupId>com.baidu.…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...