FastAPI + NGINX + Gunicorn 部署域名接口

简介: 今天接到一个活,给了我一台云服务器、域名,然后用FastAPI+NGINX来部署接口,接口的url是由域名组成的。话不多说直接看效果:

 1.安装相关工具

1.1、 安装python:

如果已经安装python就跳过咯

sudo apt update
sudo apt install python3.6 python3.6-venv -y

1.2、安装Supervisor和NGINX:

Supervisor 是一个用于类Unix操作系统(包括Linux)的进程控制系统,它用于监视和管理程序的进程。

sudo apt install supervisor nginx -y

1.3、启用并启动Supervisor:

enable命令将确保 Supervisor 在启动时自动启动,并使用start命令立即启动 Supervisor 服务

sudo systemctl enable supervisor

sudo systemctl start supervisor

2.创建虚拟环境

我们为项目单独创建一个虚推,推荐这么做。

首先cd到项目目录下(fastapi_dome为我的项目目录)

cd fastapi_dome

 创建一个名为fastpai的虚拟环境

python3.6 -m venv fastapi

激活虚拟环境

source fastapi/bin/activate

成功激活后,你的命令行提示符前面应显示fastapi

然后安装相关的第三方库

pip install fastapi[all]
pip install uvicorn
pip install gunicorn

测试能否运行

uvicorn main:app

这里可能会报错:

File "/home/ubuntu/fastapi-nginx-gunicorn/fastapi/lib/python3.6/site-packages/uvicorn/server.py", line 67, in run return asyncio.run(self.serve(sockets=sockets))
AttributeError: module 'asyncio' has no attribute 'run'

然后发现大概是因为uvicorn的版本与python版本不适配,所以我们可以将uvicorn的版本降低一点。

这样就说明成功了

3.配置Gunicorn 

配置Gunicorn有两个步骤。首先,明确指定 Gunicorn 的配置要求。其次,设置Supervisor程序来运行Gunicorn。

3.1 设置Gunicorn

在项目目录中创建一个名为 gunicorn_start 的文件:

vim gunicorn_start

然后复制粘贴以下内容到里面:

#!/bin/bash
 
NAME=fastapi-app
DIR=/home/ubuntu/fastapi_dome
USER=ubuntu
GROUP=ubuntu
WORKERS=3
WORKER_CLASS=uvicorn.workers.UvicornWorker
VENV=$DIR/fastapi/bin/activate
BIND=unix:$DIR/run/gunicorn.sock
LOG_LEVEL=error
 
cd $DIR
source $VENV
 
exec gunicorn main:app \
  --name $NAME \
  --workers $WORKERS \
  --worker-class $WORKER_CLASS \
  --user=$USER \
  --group=$GROUP \
  --bind=$BIND \
  --log-level=$LOG_LEVEL \
  --log-file=-

这是您的设定解释:

第1行表示此脚本将由bash shell执行。

第3行至第11行指定您将传递给Gunicorn的配置选项。大多数参数都是直观的,除了 WORKERS、WORKER_CLASS 和 BIND :

WORKERS:定义要使用的工作进程数量,通常建议使用CPU核心数+1。

WORKER_CLASS:指定要使用的工作进程类型。在此示例中,您指定Uvicorn Worker作为ASGI服务器。

BIND:指定Gunicorn绑定到的 server socket。

第13行和第14行将当前位置更改为项目目录并激活虚拟环境。

第16行至第24行使用指定的参数运行Gunicorn。

这里你主要修改:

        1.DIR   (改为你自己的项目目录路径)

        2.USER=ubuntu   你自己的用户名,我的都是ubuntu
        3.GROUP=ubuntu  你自己的用户组

        4. VENV = 你刚刚创建的虚拟环境的路径

保存并关闭文件。然后,通过运行以下命令使其可执行:

chmod u+x gunicorn_start

最后,在项目目录中创建一个文件夹 run ,用于存储您在参数中定义的Unix套接字文件BIND:

mkdir run

3.2 配置Supervisor

首先,在项目目录中创建一个名为 logs 的目录,用于存储应用程序的错误日志:

mkdir logs

接下来,通过运行以下命令创建Supervisor的配置文件:

sudo vim /etc/supervisor/conf.d/fastapi-app.conf

复制并粘贴以下内容到文件中:

[program:fastapi-app]
command=/home/ubuntu/fastapi_dome/gunicorn_start
user=ubuntu
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/home/ubuntu/fastapi_dome/logs/gunicorn-error.log

此配置文件指定了之前创建的 gunicorn_start 脚本,并设置了 ubuntu 作为用户。Supervisor 将在服务器启动时启动应用程序,并在应用程序失败时重新启动它。错误日志将记录在项目目录下 logs/gunicorn-error.log 文件中。

重新加载Supervisor配置并重启服务,通过运行以下命令:

sudo supervisorctl reread
sudo supervisorctl update

最后,您可以通过运行以下命令检查程序的状态:

sudo supervisorctl status fastapi-app

如果一切顺利,fastapi-app 服务的状态应显示为 RUNNING。


最后,如果您对代码进行了更改,可以通过运行以下命令重新启动服务以应用更改:

sudo supervisorctl restart fastapi-app

 4. 配置Nginx反向代理

为您的项目创建一个新的 NGINX 配置文件:

sudo vim /etc/nginx/sites-available/fastapi-app

打开NGINX配置文件并粘贴以下内容:

upstream app_server {
    server unix:/home/ubuntu/fastapi_dome/run/gunicorn.sock fail_timeout=0;
}
 
server {
    listen 80;
 
    # add here the ip address of your server
    # or a domain pointing to that ip (like example.com or www.example.com)
    server_name XXXX;
 
    keepalive_timeout 5;
    client_max_body_size 4G;
 
    access_log /home/ubuntu/fastapi_dome/logs/nginx-access.log;
    error_log /home/ubuntu/fastapi_dome/logs/nginx-error.log;
 
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
 
        if (!-f $request_filename) {
            proxy_pass http://app_server;
            break;
        }
        }
}

这是 NGINX 配置文件。它的工作原理如下:

第 1 行到第 3 行app_server定义了一个称为NGINX 将代理请求的服务器集群。请求被重定向到位于 的 Unix socket file /home/fastapi-user/fastapi-nginx-gunicorn/run/gunicorn.sock。设置fail_timeout=0告诉 NGINX 不要将服务器视为失败,即使它没有响应。

第 3 行到第 5 行定义了 NGINX 将用于处理请求的虚拟服务器的配置。在本例中,它侦听端口 80。将 XXXX 替换为 IP 或站点名称。

第 12 行和第 13 行指定keepalive_timeout设置客户端可以保持持久连接打开的最长时间,并client_max_body_size设置 NGINX 允许的客户端请求正文的大小限制。

第 15 行和第 16 行指定 NGINX 将写入其访问和错误日志的位置。

第 18 至 27 行定义了 NGINX 将如何处理对根目录的请求/。您提供一些规范来处理标头,并设置一个指令来将请求代理到您app_server之前定义的。

通过运行以下命令从文件创建符号链接来启用站点配置sites-available:sites-enabled

sudo ln -s /etc/nginx/sites-available/fastapi-app /etc/nginx/sites-enabled/

测试配置文件是否正常并重启NGINX:

sudo nginx -t
sudo systemctl restart nginx

您现在应该已经运行了 FastAPI 应用程序,并且 Gunicorn+Uvicorn 作为 ASGI 服务器,NGINX 在它们前面作为反向代理。到这里你就所有的任务了,恭喜你!!!

参考:http://t.csdnimg.cn/7mkul

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

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

相关文章

使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性

前言:什么是集成配置系统? 集成配置系统的主要目的是将应用程序的配置信息与代码分离,使得配置信息可以在不需要修改代码的情况下进行更改。这样可以提高应用程序的灵活性和可维护性。 ASP.NET Core 提供了一种灵活的配置系统,可…

C++-windows-linux-linuxdeployqt打包QT应用程序

1.windows下的qt5.14 1.1发布:发布这个选项的,也就是左下角改debug为release,设置后,点击编译build会在release中发现exe文件,直接执行exe会报错;缺失各种库。 QT命令行 要用Qt的命令行终端执行发布命令 …

零基础小白如何自学sql?

学习SQL对于数据分析和处理来说非常重要。SQL是一种强大的工具,可以帮助你与数据库沟通,提取,整理和理解数据。 以下是一些学习SQL的建议: 01 前期:SQL数据库学习 了解SQL的基本概念:首先,你…

亚信安慧AntDB超融合数据库:拓展亿级用户系统的智能化新纪元

在面对亿级用户规模的系统建设需求时,传统数据库往往面临诸多挑战。为了满足多样化的技术要求,项目通常需要倚赖多套技术体系,例如,一套关系型数据库用于元数据管理和标签化管理,另一套则专注于非结构化文件的处理。这…

Spark原理——总体介绍

总体介绍 编写小案例 (wordcount) Test def wordCount(): Unit {// 1. 创建 sc 对象val conf new SparkConf().setMaster("local[6]").setAppName("wordCount_source")val sc new SparkContext(conf)// 2. 创建数据集val textRDD…

【2023 - 探索】博0到博1,游戏新地图的探索日志

【2023 - 探索】博0到博1,游戏新地图的探索日志 写在最前面CSDN探索日志2023的探险 探索日志年终回顾探索 冒险回顾实习6月开始跟着老师做科研年中的一些其他事情9月开始上课开学后11月,读者互动 新年展望新年祝福 写在最前面 2023,我解锁了新…

C++ 之LeetCode刷题记录(八)

😄😊😆😃😄😊😆😃 开始cpp刷题之旅,多学多练,尽力而为。 先易后难,先刷简单的。 35. 搜索插入位置 给定一个排序数组和一个目标值,…

Github

文章目录 Github 的作用基本概念创建仓库以及相关介绍创建文件、查看文件信息、编辑程序上传文件搜索文件下载/检出文件 Github 的作用 项目代码托管平台 基本概念 Repository 仓库,用于存放项目代码 *Star 收藏项目,方便下次查看(有一百个st…

SpringBoot内嵌Tomcat启动流程

前言 Spring MVC 让开发者不用了解 Servlet 细节,专注于 Controller 编写 API 接口。Spring Boot 更是采用约定大于配置的设计思想,通过内嵌 Tomcat 的方式让开发者可以快速构建并部署一个 Web 应用。怎么做到的呢? Tomcat启动方式 早期的…

Java 数据结构篇-实现 AVL 树的核心方法

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 AVL 树的说明 2.0 AVL 树的成员变量及其构造方法 3.0 实现 AVL 树的核心方法 3.1 获取当前节点的高度 height(AVLNode node) 3.2 更新当前节点的高度 updateHeig…

软件安全测评需要关注哪些?湖南CMA、CNAS软件测试公司推荐

在当今信息化的社会,软件安全问题日益凸显,给个人和企业的数据安全造成了极大的威胁。为了保障软件的安全性,软件安全测评应运而生。 软件安全测评是通过对软件系统的评估,发现其中存在的安全漏洞和风险,为软件的开发…

大模型 RAG 问答技术架构及核心模块盘点:从 Embedding、prompt-embedding 到 Reranker

对于RAG而言,2023年已经出现了很多工作,草台班子有了一堆,架构也初步走通,2024年应该会围绕搜索增强做更多的优化工作。 因此我们今天来系统回顾下RAG中的模块,包括一些架构,文本嵌入embedding等&#xff…

MATLAB根据数据拟合曲线

MATLAB根据数据拟合曲线 MATLAB根据数据拟合曲线视频观看 MATLAB根据数据拟合曲线 x1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,6…

深入浅出Android dmabuf_dump工具

dmabuf是什么? 可以参考我之前写的一篇文章,在这篇文章中有介绍dma_buf:BufferManager_驱动的buffermanager-CSDN博客 dmabuf_dump工具介绍(基于Android 14) dmabuf_dump是一个可执行文件,接收参数调用libdmabufinfo.a的接口完成…

C#,入门教程(15)——类(class)的基础知识

上一篇: C#,入门教程(14)——字符串与其他数据类型的转换https://blog.csdn.net/beijinghorn/article/details/124004562 物以类聚,凡物必类。 类的使用,须遵循几个简单的原则: (1)能类则类&a…

宏集案例丨宏集PC Runtime软件助推食品行业生产线数字化革新

来源:宏集科技 工业物联网 宏集案例丨宏集PC Runtime软件助推食品行业生产线数字化革新 原文链接:https://mp.weixin.qq.com/s/DwzVzifUiidNr-FT3Zfzpg 欢迎关注虹科,为您提供最新资讯! 01 前言 近年来,中国食品行业…

想进入游戏开发领域,应该先学习C++编程还是C#编程?

想进入游戏开发领域,应该先学习C编程还是C#编程? 当你决心踏入游戏开发者的行列时,最先迎接你的将是引擎的选择。引擎是游戏的心脏,所有精彩的画面和内容都是脉脉游戏血液从引擎中流淌而出。Unity、Unreal Engine、Cocos等引擎盛…

牛客字符串

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:…

存储卷(数据卷)—主要是nfs方式挂载

1、定义 容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的,一旦容器被删除,数据会丢失。k8s基于控制器创建的pod,delete相当于重启,容器的状态会恢复到原始状态。一旦回到原始状态,后天编辑的文件…

二叉树的层序遍历(C++详解)

文章目录 写在前面解题思路具体做法 写在前面 本篇文章使用C实现了二叉树的层序遍历。在实现二叉树层序遍历时,一般情况下,大家可能直接输出遍历结果。然而,在解决在线评测(OJ)问题时,有时要求将每一层的遍…