找回密码
 会员注册
查看: 32|回复: 0

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

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
64454
发表于 2024-9-3 14:25:43 | 显示全部楼层 |阅读模式
一、前言部署一个FastAPI应用到你的服务器是一项复杂的任务。如果你对NGINX、Gunicorn和Uvicorn这些技术不熟悉,可能会浪费大量的时间。如果你是刚接触Python语言不久或者希望利用Python构建自己的Web应用程序,本文的内容可能会让你第一次部署时更节省时间。FastAPI是用于开发API应用最受欢迎的Python库之一,用于开发API。它以其出色的性能和易用性而闻名。如果你在网页应用中使用机器学习模型,那么它很可能是你首选的工具。NGINX、Gunicorn和Uvicorn都是经过实践验证的技术,常被用作反向代理和ASGI服务器来部署Python网页应用。如果你熟悉Django或Flask,你可能之前听说过它们中的一些。接下来,我将展示如何结合这些工具来部署一个FastAPI网页应用。以下是主要内容:介绍FastAPI、NGINX、Gunicorn和Uvicorn的基础知识。配置Gunicorn+Uvicorn作为ASGI服务器。设置NGINX作为反向代理服务器。使用Let'sEncrypt生成免费SSL证书。二、技术框架介绍2.1、FastAPIFastAPI是一个现代的、高性能的Web框架,用于使用Python构建API,并基于标准类型提示。它具有以下主要特点:高效运行:借助Starlette和pydantic,FastAPI提供了与NodeJS和Go类似的出色性能。FastAPI比Flask快得多,它实际上是Python最快的Web框架之一。唯一比FastAPI更快的框架是Starlette(FastAPI实际上是基于Starlette构建的)。快速开发:它可以显著提高开发速度。减少错误:减少了人为错误的可能性。直观易用:支持强大的编辑器功能、自动补全和更少的调试时间。简单易学:设计简单明了,您可以花更少时间阅读文档。减少重复代码量:最大限度地减少了代码重复。健壮可靠:提供生产就绪的代码和自动生成交互式文档功能。基于标准化:遵循API、OpenAPI和JSON模式等开放标准。该框架旨在优化开发人员体验,使您能够以简洁的代码构建具备最佳实践且适合生产环境使用的API。2.2、GunicornGunicorn是用于Python应用程序的WSGI服务器的一种实现。Gunicorn是一个符合WSGI标准的Web服务器,用于Python应用程序,它接收从客户端发送到Web服务器的请求,并将其转发到Python应用程序或Web框架(如Flask或Django)上,以便为请求运行适当的应用程序代码。2.3、Uvicorn与Flask框架不同,FastAPI不包含任何内置的开发服务器。因此,我们需要Uvicorn。它实施ASGI标准,速度快如闪电。ASGI代表异步服务器网关接口。Uvicorn是Python的ASGIWeb服务器实现。Uvicorn目前支持HTTP/1.1和WebSockets。2.4、NginxNginx是一个异步框架的Web服务器,也可以用作反向代理,负载平衡器和HTTP缓存。该软件由IgorSysoev创建,并于2004年首次公开发布。同名公司成立于2011年,以提供支持。Nginx是一款免费的开源软件,根据类BSD许可证的条款发布。一大部分Web服务器使用Nginx,通常作为负载均衡器。Nginx具备以下特点:更快:单次请求会得到更快的响应;在高并发环境下,Nginx比其他WEB服务器有更快的响应。高扩展性:Nginx是基于模块化设计,由多个耦合度极低的模块组成,因此具有很高的扩展性。许多高流量的网站都倾向于开发符合自己业务特性的定制模块。高可靠性:Nginx的可靠性来自于其核心框架代码的优秀设计,模块设计的简单性。另外,官方提供的常用模块都非常稳定,每个worker进程相对独立,master进程在一个worker进程出错时可以快速拉起新的worker子进程提供服务。低内存消耗:一般情况下,10000个非活跃的HTTPKeep-Alive连接在Nginx中仅消耗2.5MB的内存,这是Nginx支持高并发连接的基础;单机支持10万以上的并发连接:理论上,Nginx支持的并发连接上限取决于内存,10万远未封顶。热部署:master进程与worker进程的分离设计,使得Nginx能够提供热部署功能,即在7x24小时不间断服务的前提下,升级Nginx的可执行文件。当然,它也支持不停止服务就更新配置项,更换日志文件等功能。最自由的BSD许可协议:这是Nginx可以快速发展的强大动力。BSD许可协议不只是允许用户免费使用Nginx,它还允许用户在自己的项目中直接使用或修改Nginx源码,然后发布。三、服务器安全设置如果你的应用部署在局域网,你可能暂时不需要关注这块,但如果你的应用是部署在云服务器或者VPS,为了保障你的应用安全性,建议还是需要对服务器做一些必要性的安全设置,避免被攻击。3.1、启用自动更新首先,确保您的服务器拥有最新的软件:sudoaptupdate&sudoaptupgrade-y以下是在使用基于Debian的服务器时会看到的常见命令:使用命令sudoaptupdate来更新系统上的软件包列表索引。使用命令sudoaptupgrade-y将已安装的软件包升级到最新版本。使用-y标志可以跳过确认步骤,直接进行安装。接下来,设置自动安全更新,这样就不必手动执行更新。为此,您需要安装并启用unnattended-upgrades:sudoaptinstallunattended-upgrades安装完成后,编辑文件/etc/apt/apt.conf.d/20auto-upgrades并按照以下配置进行设置:APT:eriodic::Update-Package-Lists"1";#每天自动更新软件包列表APT:eriodic::Unattended-Upgrade"1";#系统将自动升级到最新版本的软件包APT:eriodic::AutocleanInterval"7";#每周运行一次自动清理操作,删除旧的和不必要的包文件最后,在文件/etc/apt/apt.conf.d/50unattended-upgrades中进行编辑,以确保系统在需要内核更新时自动重新启动:Unattended-Upgrade::Automatic-Reboot"true";完成以上步骤后,您的系统将自动执行安全更新,并在需要时重新启动以应用内核更新。3.2、创建非root用户为了减少黑客攻击造成的损害,创建非root用户是必要的。以下是一些命令来创建非root用户和设置SSH密钥登录:创建一个新的非root用户:sudoadduserfastapi-user#将fastapi-user替换为您喜欢的用户名将该用户添加到sudo组以获得管理员权限:sudousermod-aGsudofastapi-user#将fastapi-user替换为您创建的用户名使用新创建的用户登录服务器:su-fastapi-user#使用新用户登录,将fastapi-user替换为您创建的用户名设置使用SSH密钥进行身份验证:如果您还没有SSH密钥,请在本地计算机上打开终端并运行以下命令(请注意将your-email-replace-with-your-email替换为您的实际电子邮件):ssh-keygen-ted25519-C"your-email-replace-with-your-email"这将生成一对SSH密钥。复制公共SSH密钥并将其粘贴到远程服务器上(请注意将your-public-key-replace-with-your-public-key替换为实际公共密钥):echo"your-public-key-replace-with-your-public-key">>~/.ssh/authorized_keyschmod600~/.ssh/authorized_keys禁用root登录和密码身份验证:使用sudo权限编辑/etc/ssh/sshd_config文件(例如使用sudovim/etc/ssh/sshd_config命令)。将以下行的值更改为所示:PermitRootLoginnoPasswordAuthenticationno这将禁止root用户登录和使用密码进行SSH身份验证。保存并关闭文件后,重新启动SSH服务以使更改生效:sudoservicesshrestart一旦完成上述步骤,请使用新创建的非root用户和SSH密钥进行登录,并确保禁用了root登录和密码身份验证。3.3、其他安全措施大多数云提供商都提供防火墙服务。如果您的云提供商不提供防火墙服务,您可以手动配置防火墙来限制传入流量只能到达必要的端口,例如80、443和22端口。另外,您还可以安装并配置fail2ban来预防暴力身份验证攻击。Fail2ban是一个用于保护Linux服务器免受恶意登录尝试的工具。它监视系统日志文件,并根据设定的规则自动禁止源IP地址。如果您想了解更多关于保护Linux服务器的最佳实践,请查看Linode提供的相关指南。这些指南将为您提供有关如何设置和增强服务器安全性的详细信息。四、安装软件工具为了安装必要的软件工具,请按照以下步骤执行:4.1、安装Python:sudoadd-apt-repositoryppa:deadsnakes/ppasudoaptupdatesudoaptinstallpython3.11python3.11-venv-y4.2、安装Supervisor和NGINX:sudoaptinstallsupervisornginx-ySupervisor是一个用于类Unix操作系统(包括Linux)的进程控制系统,它用于监视和管理程序的进程。NGINX是一种常用的多功能软件,通常用作反向代理来部署Web应用程序。4.3、启用并启动Supervisor:sudosystemctlenablesupervisorsudosystemctlstartsupervisor使用enable命令将确保Supervisor在启动时自动启动,并使用start命令立即启动Supervisor服务。完成上述步骤后,您已成功安装Python、Supervisor和NGINX,并已启用并启动了Supervisor服务。五、设置FastAPI应用程序首先,将示例应用程序克隆到/home/fastapi-user目录下:gitclonehttps://github.com/dylanjcastillo/fastapi-nginx-gunicorn这将从公共存储库克隆代码。如果您要部署私有GitHub存储库中的应用程序,请设置GitHub部署密钥并使用该密钥克隆存储库。接下来,创建一个虚拟环境并激活它:cd/home/fastapi-user/fastapi-nginx-gunicornpython3.11-mvenv.venvsource.venv/bin/activate这些命令将使您进入项目目录,并在其中创建一个虚拟环境并激活它。一旦成功激活,您的命令行提示符前面应显示.venv。现在,使用requirements.txt文件中指定的依赖项安装所需的软件包:pipinstall-rrequirements.txt这将在当前虚拟环境中安装fastapi、gunicorn和uvicorn等软件包。为了验证一切是否顺利,运行应用程序:uvicornmain:app运行此命令时不应出现任何错误。您还可以打开新终端窗口,并连接到服务器,然后使用以下命令发出请求来验证它是否正常工作:curlhttp://localhost:8000您应该会收到以下响应:{"message":"It'sworking!"}现在您已经成功运行了FastAPI应用程序,接下来将配置Gunicorn作为WSGI服务器。六、配置Gunicorn配置Gunicorn有两个步骤。首先,明确指定Gunicorn的配置要求。其次,设置Supervisor程序来运行Gunicorn。6.1设置Gunicorn首先,在项目目录中创建一个名为gunicorn_start的文件:vimgunicorn_start然后,将以下内容添加到文件中:#!/bin/bashNAME=fastapi-appDIR=/home/fastapi-user/fastapi-nginx-gunicornUSER=fastapi-userGROUP=fastapi-userWORKERS=3WORKER_CLASS=uvicorn.workers.UvicornWorkerVENV=$DIR/.venv/bin/activateBIND=unixDIR/run/gunicorn.sockLOG_LEVEL=errorcd$DIRsource$VENVexecgunicornmain:app\--name$NAME\--workers$WORKERS\--worker-class$WORKER_CLASS\--user=$USER\--group=$GROUP\--bind=$BIND\--log-level=$LOG_LEVEL\--log-file=-这是您的设定解释:第1行表示此脚本将由bashshell执行。第3行至第11行指定您将传递给Gunicorn的配置选项。大多数参数都是直观的,除了WORKERS、WORKER_CLASS和BIND:WORKERS:定义要使用的工作进程数量,通常建议使用CPU核心数+1。WORKER_CLASS:指定要使用的工作进程类型。在此示例中,您指定UvicornWorker作为ASGI服务器。BIND:指定Gunicorn绑定到的serversocket。第13行和第14行将当前位置更改为项目目录并激活虚拟环境。第16行至第24行使用指定的参数运行Gunicorn。保存并关闭文件。然后,通过运行以下命令使其可执行:chmodu+xgunicorn_start最后,在项目目录中创建一个文件夹run,用于存储您在参数中定义的Unix套接字文件BIND:mkdirrun6.2配置Supervisor首先,在项目目录中创建一个名为logs的目录,用于存储应用程序的错误日志:mkdirlogs接下来,通过运行以下命令创建Supervisor的配置文件:sudovim/etc/supervisor/conf.d/fastapi-app.conf复制并粘贴以下内容到文件中:[program:fastapi-app]command=/home/fastapi-user/fastapi-nginx-gunicorn/gunicorn_startuser=fastapi-userautostart=trueautorestart=trueredirect_stderr=truestdout_logfile=/home/fastapi-user/fastapi-nginx-gunicorn/logs/gunicorn-error.log此配置文件指定了之前创建的gunicorn_start脚本,并设置了fastapi-user作为用户。Supervisor将在服务器启动时启动应用程序,并在应用程序失败时重新启动它。错误日志将记录在项目目录下logs/gunicorn-error.log文件中。重新加载Supervisor配置并重启服务,通过运行以下命令:sudosupervisorctlrereadsudosupervisorctlupdate最后,您可以通过运行以下命令检查程序的状态:sudosupervisorctlstatusfastapi-app如果一切顺利,fastapi-app服务的状态应显示为RUNNING。您还可以通过打开新的终端窗口,连接到服务器,并使用以下命令发出GET请求来测试它:curl--unix-socket/home/fastapi-user/fastapi-nginx-gunicorn/run/gunicorn.socklocalhost您应该会看到以下输出:{"message":"It'sworking!"最后,如果您对代码进行了更改,可以通过运行以下命令重新启动服务以应用更改:sudosupervisorctlrestartfastapi-app现在您已经拥有一个使用Gunicorn和Uvicorn作为ASGI服务器的应用程序。接下来,您将使用NGINX设置反向代理服务器。七、配置NGINX为您的项目创建一个新的NGINX配置文件:sudovim/etc/nginx/sites-available/fastapi-app打开NGINX配置文件并粘贴以下内容:upstreamapp_server{serverunix:/home/fastapi-user/fastapi-nginx-gunicorn/run/gunicorn.sockfail_timeout=0;}server{listen80;#addheretheipaddressofyourserver#oradomainpointingtothatip(likeexample.comorwww.example.com)server_nameXXXX;keepalive_timeout5;client_max_body_size4G;access_log/home/fastapi-user/fastapi-nginx-gunicorn/logs/nginx-access.log;error_log/home/fastapi-user/fastapi-nginx-gunicorn/logs/nginx-error.log;location/{proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_headerHost$http_host;proxy_redirectoff;if(!-f$request_filename){proxy_passhttp://app_server;break;}}}这是NGINX配置文件。它的工作原理如下:第1行到第3行app_server定义了一个称为NGINX将代理请求的服务器集群。请求被重定向到位于的Unixsocketfile/home/fastapi-user/fastapi-nginx-gunicorn/run/gunicorn.sock。设置fail_timeout=0告诉NGINX不要将服务器视为失败,即使它没有响应。第1行到第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-enabledsudoln-s/etc/nginx/sites-available/fastapi-app/etc/nginx/sites-enabled/测试配置文件是否正常并重启NGINX:sudonginx-tsudosystemctlrestartnginx如果一切顺利,现在您应该能够从浏览器或使用curl.您应该再次看到以下输出:{"message":"It'sworking!"}您现在应该已经运行了FastAPI应用程序,并且Gunicorn+Uvicorn作为ASGI服务器,NGINX在它们前面作为反向代理。7.1、权限错误如果出现权限错误,表示NGINX无法访问Unixsocket,您可以将用户www-data(通常是NGINX进程运行的用户)添加到fastapi-user组中。您可以使用以下命令:sudousermod-aGfastapi-userwww-data如果您还没有为API应用购买域名,则不需要往下阅读了。如果您已经有域名,请继续执行下一步以获取SSL证书并启用HTTPS。八、使用Certbot获取免费SSL证书这仅适用于您希望为其获取SSL证书的域名。如果您使用的是Ubuntu,则可以跳过此步骤。否则,您首先需要安装snapd:sudoaptinstallsnapd接下来,确保您拥有最新可用版本:sudosnapinstallcore;sudosnaprefreshcore安装Certbot并确保certbot命令可执行:sudosnapinstall--classiccertbotsudoln-s/snap/bin/certbot/usr/bin/certbot接下来,通过以交互方式运行以下命令为您的域名生成证书:sudocertbot--nginx最后,Certbot将自动处理您证书的续订。要测试它是否有效,请运行以下命令:sudocertbotrenew--dry-run如果一切顺利,您应该会看到Congratulations,allsimulatedrenewalssucceeded…消息。现在,您应该能够通过HTTPS成功发送请求。九、结论本篇文章介绍了如何使用NGINX、Gunicorn和Uvicorn来部署FastAPI应用程序。FastAPI是最流行的PythonWeb框架之一。它已成为部署机器学习驱动的Web应用程序的首选,因此你希望持续关注AI领域,并希望能做一定的应用开发实践,熟悉它还是挺有帮助的。在这篇文章中您了解到:为什么以及何时应该使用FastAPI、NGINX、Gunicorn和Uvicorn。如何设置Gunicorn+Uvicorn作为ASGI服务器。如何使用Supervisor来运行Gunicorn。如何使用certbot配置NGINX并生成免费的SSL证书。如果你对这篇文章感兴趣,而且你想要了解更多关于AI领域的实战技巧,可以关注「技术狂潮AI」公众号。在这里,你可以看到最新最热的AIGC领域的干货文章和案例实战教程。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-27 13:26 , Processed in 0.640760 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表