怎样在 Ubuntu 20.04 上使用 Gunicorn 和 Nginx 部署 FastAPI 应用程序

介绍

FastAPI 是一个用于构建 API 和 Web 应用程序的 Python Web 框架。 它支持现代 Python 功能,如异步和类型提示,使其快速高效。 此外,它使用异步服务器网关接口 (ASGI) 标准与客户端进行异步、并发连接,如果需要,它可以与 WSGI 一起使用。

在本文中,您将了解在 Ubuntu 20.04 服务器上使用 Gunicorn 和 Nginx 部署 FastAPI 应用程序所需的一切,例如在虚拟环境中设置 FastAPI 应用程序、使用 Gunicorn 作为应用程序服务器、Nginx 作为反向代理和保护 Nginx使用 SSL 证书。 它不包括安装任何数据库服务器以实现标准化的步骤,因为 FastAPI 可以与任何数据库服务器一起使用。 数据库服务器安装可以参考以下文章:

  • 在 Ubuntu 20.04 上安装 MySQL
  • 在 Ubuntu 20.04 上安装 PostgreSQL
  • 在 Ubuntu 20.04 上安装 MongoDB

先决条件

  • 部署一个全新的 Ubuntu 20.04 服务器
  • 创建非根 sudo 用户
  • 将域/子域指向您服务器的公共 IP

警告: 执行前检查命令。 有些命令可能需要根据您的系统进行更改,例如用户、项目名称、项目目录、域等。

设置 FastAPI 应用程序

  1. 初始化项目目录

    如果您已经有一个包含所有代码的 git 存储库,则可以跳过此步骤。 在这种情况下,您可以克隆您的存储库,这将为您的项目创建一个新目录。 在这里,我们将创建一个目录来包含与我们的项目相关的所有内容,包括代码库和虚拟环境。

    为您的项目创建一个文件夹。

    $ mkdir /home/demo/fastapi_demo
    

    打开项目目录。

    $ cd /home/demo/fastapi_demo
    
  2. 创建虚拟环境

    虚拟环境是用于依赖管理和项目隔离的 Python 工具。 这意味着每个项目都可以将任何包安装在本地隔离目录中,而不是全局安装。

    安装 Python 虚拟环境包。

    $ sudo apt update
    $ sudo apt install python3-venv
    

    为您的项目创建 Python 虚拟环境。

    $ python3 -m venv venv
    

    在本文中,每当需要在虚拟环境中执行命令时,命令片段将以 (venv) $.

    Enter 虚拟环境。

    $ source venv/bin/activate
    

    Exit 虚拟环境。

    (venv) $ deactivate
    
  3. 安装依赖项

    确保您只使用 pip 无论主机上安装的 pip 版本怎样,都可以使用命令。 当您在虚拟环境中时,路径会被修改(直到您退出),使得 pip 如果您使用 pip3 或 pip 以外的任何命令,则 command 将引用隔离虚拟环境的 pip 可执行文件,它可能会全局执行。

    安装轮 Python 包。

    (venv) $ pip install wheel
    

    安装 fastapi Python 包。

    (venv) $ pip install fastapi[all]
    
  4. 制作基本的 FastAPI 应用程序

    如果您已经准备好部署 FastAPI 应用程序,则可以跳过此步骤。 在这里,我们提供了一个非常基本的“Hello World”项目代码,用于演示目的。

    创建和编辑 app.py

    $ nano app.py
    

    粘贴以下代码并使用 CTRL + X 然后 ENTER 保存文件。

        from fastapi import FastAPI
        app = FastAPI()
    
    
        @app.get("https://www.vultr.com/")
        async def home():
            return {"message": "Hello World"}
    
  5. 测试部署

    部署一个临时 Web 服务器进行测试。

    (venv) $ uvicorn app:app
    

    要验证一切是否正常,请打开一个重复的终端并运行。

    $ curl https://localhost:8000
    

    提供的演示代码的预期输出是:

    {"message": "Hello World"}
    

使用 Gunicorn 部署 FastAPI

Gunicorn 是一个用于 UNIX 的 Python WSGI HTTP 服务器。 它使管理和监视 Web 应用程序变得更加容易。 鉴于其可定制的性质,我们可以通过使用 Uvicorn 的工人类来使用 ASGI 功能。

  1. 安装 Gunicorn

    安装 gunicorn Python 包。

    (venv) $ pip install gunicorn
    
  2. 测试部署

    部署一个临时 Web 服务器进行测试。

    (venv) $ gunicorn app:app -k uvicorn.workers.UvicornWorker
    

    要验证一切是否正常,请打开一个重复的终端并运行。

    $ curl https://localhost:8000
    

    提供的演示代码的预期输出是:

    {"message": "Hello World"}
    
  3. 创建系统服务

    添加 Gunicorn 的配置文件。

    $ nano gunicorn_conf.py
    

    粘贴以下代码并使用 CTRL + X 然后 ENTER 保存文件。

    from multiprocessing import cpu_count
    
    # Socket Path
    bind = 'unix:/home/demo/fastapi_demo/gunicorn.sock'
    
    # Worker Options
    workers = cpu_count() + 1
    worker_class="uvicorn.workers.UvicornWorker"
    
    # Logging Options
    loglevel="debug"
    accesslog = '/home/demo/fastapi_demo/access_log'
    errorlog =  '/home/demo/fastapi_demo/error_log'
    

    创建和编辑 systemd 单元文件。

    $ sudo nano /etc/systemd/system/fastapi_demo.service
    

    粘贴以下代码并使用 CTRL + X 然后 ENTER 保存文件。

    [Unit]
    Description=Gunicorn Daemon for FastAPI Demo Application
    After=network.target
    
    [Service]
    User=demo
    Group=www-data
    WorkingDirectory=/home/demo/fastapi_demo
    ExecStart=/home/demo/fastapi_demo/venv/bin/gunicorn -c gunicorn_conf.py app:app
    
    [Install]
    WantedBy=multi-user.target
    

    启动并启用服务。

    $ sudo systemctl start fastapi_demo
    $ sudo systemctl enable fastapi_demo
    

    要验证是否一切正常,请运行以下命令。

    $ sudo systemctl status fastapi_demo
    

    预期输出:

    此外,您可以使用以下命令检查响应。

    $ curl --unix-socket unix:/home/demo/fastapi_demo/gunicorn.sock localhost
    

    提供的演示代码的预期输出是:

    {"message": "Hello World"}
    

将 Nginx 设置为反向代理

Nginx 是一个开源、轻量级且功能强大的 Web 服务器。 建议使用 Nginx 作为反向代理来进行无缝请求处理。 此外,如果您愿意,可以利用 Nginx 的 vhost / 虚拟服务器功能在单个主机上托管多个 Web 应用程序。 您还可以通过使用附加的直接提供静态文件来减轻 WSGI/ASGI 服务器的一些负载 location 我们的服务器块中的指令。

  1. 安装 Nginx

    $ sudo apt update
    $ sudo apt install nginx
    
  2. 添加虚拟主机配置

    将 vhost 文件添加到 sites-available 目录。

    $ sudo nano /etc/nginx/sites-available/fastapi_demo
    

    粘贴以下内容(将 your_domain 替换为您的实际域)并使用 CTRL + X 然后 ENTER 保存文件。

    server {
        listen 80;
        server_name your_domain www.your_domain;
    
        location / {
            proxy_pass https://unix:/home/demo/fastapi_demo/gunicorn.sock;
        }
    }
    
  3. 激活虚拟主机配置

    在中添加vhost文件的软链接 sites-enabled 目录。

    $ sudo ln -s /etc/nginx/sites-available/fastapi_demo /etc/nginx/sites-enabled/
    
  4. 测试并重新加载配置

    测试配置。

    $ sudo nginx -t
    

    预期输出:

    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    

    重新加载 Nginx。

    $ sudo systemctl reload nginx
    

使用 SSL 证书保护 Nginx

SSL 证书用于加密用户和源服务器之间的流量。 这对于处理敏感数据的应用程序至关重要。 我们将使用 Let’s Encrypt 免费获得 SSL 证书。 请确保您已将您的域指向服务器的公共 IP。

  1. 安装 Certbot

    $ sudo apt install -y certbot python3-certbot-nginx
    
  2. 在 Nginx 上安装证书

    运行以下命令时,系统会要求您输入电子邮件地址。 请输入您的电子邮件地址,其余设置为默认值。

    $ sudo certbot --nginx -d your_domain -d www.your_domain
    
  3. 验证可访问性

    您可以通过在 Web 浏览器中打开以下链接来验证 SSL 证书是否配置正确。

    https://your_domain
    
  4. 测试自动续订

    Let’s Encrypt 证书的有效期仅为 90 天,但 certbot 将处理自动续订。 您可以通过运行以下命令来验证自动续订是否有效:

    $ sudo certbot renew --dry-run
    

    如果上述命令没有抛出错误,则意味着您的 SSL 证书将自动更新,没有任何问题。

结论

在本文中,您学习了怎样使用虚拟环境来隔离依赖项、设置 FastAPI 应用程序、使用 Gunicorn 作为应用程序服务器、使用 Nginx 作为反向代理服务器以及使用 SSL 证书保护 Nginx。 更多FastAPI相关信息,请访问官方 FastAPI 网站.

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com