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 你自己的用户组

  1. 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。

ubuntu20.04的话可能遇到这个问题:

supervisor: couldn't exec /opt/apps/collect-app/scripts/start-flume-agent.sh: ENOEXEC

supervisor: child process was not spawned

你需要将command=的后面加上sh , 如上图所示

然后:

复制代码
supervisorctl reread
supervisorctl update fastapi-app

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

复制代码
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

相关推荐
别猜别猜了26 分钟前
Linux操作系统02
linux·运维·服务器
C++ 老炮儿的技术栈42 分钟前
Visual Studio 2022 MFC Dialog 添加Toolbar及Tips提示
服务器·c语言·数据库·c++·ide·算法·visual studio
阿巴~阿巴~42 分钟前
实战Linux进程状态观察:R、S、D、T、Z状态详解与实验模拟
linux·运维·服务器
vivo互联网技术1 小时前
vivo Pulsar 万亿级消息处理实践(3)-KoP指标异常修复
java·大数据·服务器·后端·kafka·消息队列·pulsar
南川琼语1 小时前
Linux——I/O复用
linux·运维·服务器
柳如烟@1 小时前
零基础,使用Idea工具写一个邮件报警程序
java·服务器·前端
一只小阿乐2 小时前
window 服务器上部署前端静态资源以及nginx 配置
运维·服务器·nginx
bjzhang752 小时前
docker部署tomcat网站服务器
服务器·docker·tomcat
Jay Kay3 小时前
brpc中后端server挂在同一个命名服务和不同命名服务的区别详解
运维·服务器·brpc
Linux运维技术栈3 小时前
Nginx 动静分离原理与工作机制详解:从架构优化到性能提升
运维·nginx·架构