Code前端首页关于Code前端联系我们

FastAPI + NGINX + Gunicorn:了解如何部署强大的 Python Web 应用程序

terry 2年前 (2023-09-24) 阅读数 74 #后端开发

1. 介绍

FastAPI到您的服务器是一项复杂的任务。如果 NGINXGunicorn 和 ,你可能在浪费时间。 。如果您是 Python 新手或想要使用 Python 构建自己的 Web 应用程序,本文中的内容可以在初始设置期间节省您的时间。

FastAPI 是用于开发 API 应用程序的最流行的 Python 库之一。它以其卓越的性能和易用性而闻名。如果您正在将机器学习模型用于 Web 应用程序,那么它可能是您的首选工具。

NGINX、Gunicorn 和 Uvicorn 都是经过验证的技术,通常用作部署 Python Web 应用程序的反向代理和 ASGI 服务器。如果您了解 Django 或 Flask,您以前可能听说过其中的一些。

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

接下来,我将向您展示如何组合这些工具来部署 FastAPI Web 应用程序。要点如下:

  • 介绍 FastAPI、NGINX、Gunicorn 和 Uvicorn 的基础知识。
  • 将 Gunicorn + Uvicorn 配置为 ASGI 服务器。
  • 将 NGINX 设置为反向代理。
  • 使用 Let's Encrypt 创建免费的 SSL 证书。

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

2。技术框架简介

2.1、FastAPI

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

FastAPI是一个现代的高性能 Web 框架,用于在 Python 中构建 API,并且基于标准类型提示。

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

它具有以下主要特点:

  • 高效运行:借助 Starlette 和 pydantic,FastAPI 提供了类似于 NodeJS 和 Go 的卓越性能。 FastAPI 比 Flask 快得多,它实际上是 Python 最快的 Web 框架之一。唯一比 FastAPI 更快的框架是 Starlette(FastAPI 实际上内置于 Starlette 中)。
  • 快速开发:可以显着加快开发速度。
  • 减少错误:减少人为错误的可能性。
  • 直观且易于使用:支持强大的编辑功能、自动完成和更少的调试时间。
  • 易于学习:设计简单明了,您可以花更少的时间阅读文档。
  • 减少重复代码的数量:最大限度地减少代码重复。
  • 感知且可靠:提供生产就绪代码和自动交互式文档生成。
  • 基于标准化:遵循API、OpenAPI、JSON Schema等开放标准。

该框架旨在优化开发人员体验,使您能够使用干净的代码构建最佳实践的生产就绪 API。

2.2,Gunicorn

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

Gunicorn 是 Python 应用程序的 WSGI 服务器实现。

Gunicorn 是一个 WSGI 符合标准的 Web 服务器,用于接收消息的 Python 应用程序 ❀

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

Web 服务器 并将它们转发到 Python 应用程序或 。到 Web 框架(例如 Flask 或 Django),以针对请求执行适当的应用程序代码。

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

2.3,Uvicorn

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

与 Flask 框架不同,FastAPI 不包含内置的开发服务器。这就是为什么我们需要Uvicorn。它实现了 ASGI 标准并且速度快如闪电。 ASGI 代表异步服务器网关接口

  • Uvicorn 是 Python 的 ASGI Web 服务器实现。
  • Uvicorn 目前支持 HTTP/1.1 和 WebSocket。

2.4,Nginx

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

Nginx是一个异步框架Web服务器,也可以用作反向代理、负载均衡器和HTTP缓存。该软件由 Igor Sysoev 创建,于 2004 年首次发布。2011 年成立了一家同名公司提供支持。 Nginx 是在类似 BSD 许可证下发布的免费开源软件。大量 Web 服务器使用 Nginx,通常作为负载均衡器。

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

Nginx 具有以下特点:

  • 更快 :单个请求得到更快的响应;在高并发环境下,Nginx比其他WEB服务器有更快的响应速度。
  • 高可扩展性:Nginx基于模块化结构,由多个耦合度很低的模块组成,因此具有很高的可扩展性。许多高流量网站倾向于开发适合其业务特点的自定义模块。
  • 高可靠性:Nginx的可靠性来自于其核心框架代码的优秀设计和模块设计的简单性。另外,官方提供的常用模块非常稳定,各个worker进程相对独立。当某个worker进程出现故障时,主进程可以快速启动新的worker子进程来提供服务。
  • 低内存消耗:通常 10,000 个被动 HTTP Keep-Alive 连接仅消耗 5♿♿♿❓2 MB x 内存 Nginx 支持高并发基础连接;一台机器支持超过10万个同时连接:理论上,Nginx支持的同时连接数上限取决于内存,10万离上限还很远。
  • 热部署:主进程和工作进程分离的设计使Nginx能够提供热部署功能,即在7x24小时不间断服务的框架内更新Nginx可执行文件。当然,它还支持在不停止服务的情况下更新配置项、更改日志文件等功能。
  • 最宽松的BSD许可证:这是Nginx快速发展的强大动力。 BSD许可证不仅允许用户免费使用Nginx,还允许用户直接在自己的项目中使用或修改Nginx源代码然后发布。

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

3。服务器安全设置

如果您的应用程序部署在本地网络上,您可能暂时不需要关注这一点,但如果您的应用程序部署在云服务器或VPS上,请确保您的应用程序的安全。应用程序中,建议还是需要在服务器上进行一些必要的安全设置,以避免受到攻击。

3.1。启用自动更新

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

首先,确保您的服务器拥有最新的软件:

sudo apt update && sudo apt upgrade -y

以下是使用基于 Debian 的服务器时您会看到的常用命令:

  1. 使用命令 sudo apt update 更新系统的包列表目录。
  2. 使用命令sudo apt update -y将已安装的软件包更新到最新版本。使用标志 -y 跳过确认步骤并直接进行安装。

接下来,设置自动安全更新,这样您就不必手动执行更新。为此,您需要安装并启用 无人值守升级

sudo apt install unattended-upgrades

安装完成后,编辑文件 /etc/apt/apt.conf.d/20。 并按照下面的配置进行配置:

APT::Periodic::Update-Package-Lists "1";  # 每天自动更新软件包列表
APT::Periodic::Unattended-Upgrade "1";    # 系统将自动升级到最新版本的软件包
APT::Periodic::AutocleanInterval "7";     # 每周运行一次自动清理操作,删除旧的和不必要的包文件

最后,编辑文件 /etc/apt/apt.conf.d/50unattended-upgrades 以确保系统在内核更新时自动重新启动需要:

Unattended-Upgrade::Automatic-Reboot "true";

完成上述步骤后,您的系统将自动运行安全更新,并在需要安装内核更新时重新启动。

3.2。创建非root用户

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

为了减少黑客攻击造成的损害,有必要创建非root用户。以下是创建非 root 用户并设置 SSH 密钥登录的一些命令:

  • 创建新的非 root 用户:
sudo adduser fastapi-user # 将fastapi-user替换为您喜欢的用户名
  • 将该用户添加到 sudo 组以获得管理权限:
sudo usermod -aG sudo fastapi-user # 将fastapi-user替换为您创建的用户名
  • 使用新创建的用户登录到服务器:
su - fastapi-user # 使用新用户登录,将fastapi-user替换为您创建的用户名
  • 使用 SSH 密钥设置身份验证:

如果您还没有 SSH 密钥,请在本地计算机上打开终端并运行以下命令(注意替换您的电子邮件)。 with- 将您的电子邮件替换为您的真实电子邮件):

ssh-keygen -t ed25519 -C "your-email-replace-with-your-email"

这将生成 SSH 密钥。

复制 SSH 公钥并将其附加到远程服务器(注意,您的公钥必须替换为实际的公钥):

echo "your-public-key-replace-with-your-public-key" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
  • 禁用 root 用户登录和密码身份验证:

编辑 / etc/ssh/sshd_config 文件

具有 sudo 权限(例如使用 /shd/shd_config/sh/s 命令)。

将以下行的值更改为所示的值:

PermitRootLogin no
PasswordAuthentication no

这将禁用 root 登录和密码 SSH 身份验证。

  • 保存并关闭文件后,重新启动 SSH 服务以使更改生效:
sudo service ssh restart

完成上述步骤后,使用新创建的非 root 用户和 SSH 密钥登录,并确保您已登录给主要用户。并且密码身份被禁用。

3.3。其他安全措施

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

大多数云服务提供商都提供防火墙服务。如果您的云服务提供商不提供防火墙服务,您可以手动配置防火墙,将传入流量限制为仅流入必要的端口,例如8044322

或者,您可以安装和配置 fail2ban 以防止暴力身份验证攻击。 Fail2ban 是一个保护 Linux 服务器免受恶意登录尝试的工具。它监控系统日志文件并根据设定的规则自动禁止源 IP 地址。

如果您想了解有关保护 Linux 服务器的最佳实践的更多信息,请查看此 Linode 指南。这些指南为您提供有关配置和提高服务器安全性的详细信息。 ?用于类 Unix 操作系统(包括 Linux)的进程控制系统,用于监视和管理程序进程。 NGINX 是一种常用的多用途软件,通常用作部署 Web 应用程序的反向代理。

4.3。启用并启动 Supervisor:

sudo apt install unattended-upgrades

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

完成上述步骤后,您已经成功安装了Python、Supervisor和NGINX,并启用并启动了Supervisor服务。

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

5。设置 FastAPI 应用程序

首先,将示例应用程序克隆到 /home/fastapi-user 目录:

git clone https://github.com/dylanjcastillo/fastapi-nginx-gunicorn

这将从公共存储库克隆代码。如果您要从私有 GitHub 存储库部署应用程序,请设置 GitHub 部署密钥并使用它来克隆存储库。

接下来,创建一个虚拟环境并激活它:

cd /home/fastapi-user/fastapi-nginx-gunicorn
python3.11 -m venv .venv
source .venv/bin/activate

这些命令会将您带到项目目录,在那里创建一个虚拟环境,然后激活它。成功激活后,命令行提示符前面应带有.venv

现在安装

中的requirements.txt中所需的软件包:

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

这将安装
pip install -r requirements.txt

这将安装 虚拟环境 、 类似gunicorn uvicorn

通过运行应用程序确保一切正常:

uvicorn main:app

运行此命令时不应出现错误。您还可以打开一个新的终端窗口并连接到服务器并使用以下命令发出请求,以确保其正常工作:

curl http://localhost:8000

您应该收到以下响应:

{"message":"It's working!"}

现在您已成功运行 FastAPI Next ,我们将配置 Gunicorn 作为 WSGI 服务器。

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

6. 定义 Gunicorn

分两步定义 Gunicorn。首先明确Gunicorn的配置要求。其次,配置Supervisor程序来运行Gunicorn。 ?这是您的设备 清晰的解释:

  • 第 1 行显示 bash shell 执行此脚本。
  • 第 3-11 行定义要传递到 Gunicorn 的配置设置。大多数参数都很直观,除了 WORKERSWORKER_CLASS 和 ♺♺

- WORKERS

:指定用于作业的进程数,一般建议使用CPU-核心数+1。

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

-BIND:指定 Gunicorn 绑定到的 服务器套接字

  • 第 13 行和第 14 行将当前位置更改为项目目录并激活虚拟环境。
  • 第 16-24 行使用具有指定参数的 Gunicorn。

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

chmod u+x gunicorn_start

最后,在项目目录中创建一个文件夹来存储您在run参数中指定的 BIND Unix 套接字文件:❀❙2❙2 ❙。 首先,在项目目录中创建一个目录logs来存储应用程序错误日志:

mkdir logs

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

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

这个配置文件定义了之前创建的 gunicorn_start- 脚本并设置 fastapi 用户。 Supervisor 在服务器启动时启动应用程序,如果失败则重新启动应用程序。错误日志保存在项目目录下的logs/gunicorn-error.log文件中。

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

sudo supervisorctl reread
sudo supervisorctl update

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

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

您还可以通过打开新的命令来连接到服务器终端窗口并通过使用以下命令发出 GET 请求来测试它:

curl --unix-socket /home/fastapi-user/fastapi-nginx-gunicorn/run/gunicorn.sock localhost

您应该看到以下输出:

{"message":"It's working!"

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

sudo supervisorctl restart fastapi-app

现在您已经有了一个使用 Gunicorn 和 Uvicorn 作为 ASGI 服务器的应用程序。接下来,使用 NGINX 配置反向代理。

FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

7。配置NGINX

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

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

打开NGINX配置文件并粘贴此NGINX配置文件并粘贴以下内容:IN。它的工作原理如下:

  • 第 1-3 行 app_server 定义了一个名为 NGINX 的服务器集群,它将发送代理请求。该请求被定向到 Unix 套接字文件 /home/fastapi-user/fastapi-nginx-gunicorn/run/gunicorn.sock。设置 fail_timeout=0 告诉 NGINX 不要将服务器视为失败,即使它没有响应。
  • 第 1–5 行 定义 NGINX 用于处理请求的虚拟服务器配置。在此示例中,它正在侦听端口 80。将 XXXX 替换为您的 IP 地址或站点名称。
  • 第12行和第13行定义keepalive_timeout设置客户端可以保持持久连接打开的最长时间,并且
设置NGINX允许的客户端请求文本的限制。

  • 第 15 行和第 16 行 指定 NGINX 写入其访问和错误日​​志的位置。
  • 第18-27行定义NGINX如何处理根目录/。您提供一些配置来处理标头,并配置命令以将请求代理到您之前定义的 app_server 服务器。
  • 通过从文件 sites-available: sites-enabled

    FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

    sites-enabled

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

    测试配置文件是否正常以及休息 X:如果一切顺利,现在您应该可以在浏览器中或使用curl执行此操作。您应该再次看到以下输出:

    {"message":"It's working!"}

    您现在应该运行一个 FastAPI 应用程序,其中 Gunicorn + Uvicorn 作为 ASGI 服务器,NGINX 作为前面的反向代理运行。 ?在中间。您可以使用以下命令:

    sudo usermod -aG fastapi-user www-data

    如果您尚未为 API 应用程序购买域名,则无需继续阅读。如果您已有域名,请继续下一步获取SSL证书并启用HTTPS。

    FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

    8. 使用 Certbot 获取免费 SSL 证书

    这只适用于您想要为其获取 SSL 证书的域名。如果您使用的是 Ubuntu,则可以跳过此步骤。否则,您需要首先安装 snapd

    sudo apt install snapd

    接下来,确保您拥有可用的最新版本:

    sudo snap install core; sudo snap refresh core

    安装 Certbot 并确保运行 ‿♓ – 命令:

    sudo snap install --classic certbot
    sudo ln -s /snap/bin/certbot /usr/bin/certbot

    接下来,通过交互执行以下命令为您的域创建证书:

    sudo certbot --nginx

    最后,Certbot 将自动续订证书。通过运行以下命令来测试它是否有效:

    sudo certbot renew --dry-run

    如果一切顺利,您应该看到 恭喜,所有模拟刷新均成功...

    您现在应该能够通过 HTTPS 成功发送请求。

    FastAPI + NGINX + Gunicorn:教你部署一个高性能的Python网页应用

    9。结论

    本文介绍了NGINXGunicorn来实现FastAPI应用程序。 FastAPI 是最流行的 Python Web 框架之一。它已经成为部署基于机器学习的Web应用程序的首选,因此如果你想持续关注人工智能领域并做一些应用程序开发实践,熟悉它是有用的。

    在本文中,您将了解:

    • 为什么以及何时应该使用 FastAPI、NGINX、Gunicorn 和 Uvicorn
    • 如何将 Gunicorn+Put 配置为 ASGI 服务器
    • 如何与 Supervisor 一起运行 Gunicorn
    • 如何使用 certbot 配置 NGINX 并生成免费的 SSL 证书

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门