本页内容

  • 准备工作
  • 安装依赖项
  • 安装 Flask 和 Gunicorn
  • 使用 Flask 创建第一个应用
  • 使用 wsgi 和 Gunicorn 运行 Flask 应用
  • 使用 Supervisor 运行 Flask 应用
  • 配置 Nginx 作为反向代理
  • 访问 Flask 应用
  • 结语

Flask 是一个用 Python 编写的微框架,用于开发现代 Web 应用和 API(Application Programming Interface,应用程序编程接口)。它基于 Werkzeug 工具包和 Jinja2 模板引擎。与采用复杂架构的框架不同,Flask 是一个小巧的 Web 框架,其核心易于扩展且易于学习,因为 Flask 的代码量更少。Flask 不包含 ORM,但仍然具备 URL 路由和模板引擎等实用特性。

Gunicorn("Green Unicorn",绿色独角兽)是一个采用预派生(pre-fork)工作模式的 WSGI HTTP 服务器。它移植自 Ruby 的 Unicorn 项目。Gunicorn 可以与多种 Web 框架搭配使用,它对服务器资源占用低且速度快。Gunicorn 位于你的应用和 Web 服务器之间,因此你可以将它搭配 Nginx、Apache2 等 Web 服务器一起使用。

本指南将向你展示如何在 Debian 12 上开始使用 Flask。你将安装 Flask,并创建第一个 Flask 应用,随后你还将配置该 Flask 应用,使其通过 Gunicorn、Supervisor 和 Nginx Web 服务器运行。

准备工作

要继续本指南,请准备好:

  • 一台 Debian 12 机器——Server 版或 Desktop 版均可。
  • 一个具有 sudo 管理员权限的非 root 用户。

安装依赖项

在安装 Flask 之前,你必须确保系统上已安装所需的依赖项,例如 Python 3.11、用于创建 Python 虚拟环境的 Pip 和 venv 模块、将用作反向代理的 Nginx,以及用于管理 Flask 应用的 Supervisor。

完成以下步骤以安装 Flask 的依赖项。

首先,运行以下 apt update 命令以刷新你的 Debian 软件包索引。

sudo apt update

软件包索引更新完成后,执行以下 apt install 命令安装软件包依赖项。其中包括 pip、venv、Nginx 和 supervisor。

sudo apt install python3 python3-pip python3-venv nginx supervisor

输入 y 确认安装,然后按 ENTER 继续。

在 Debian 12 上使用 Nginx 和 Gunicorn 部署 Flask 应用

一切安装完成后,运行以下命令将默认的 python 命令指向 python3。

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10

然后执行以下命令验证 python、pip 和 venv 的版本。这将确保所需的 Python 依赖项已安装。

python --version
pip --version
python -m venv -v

你应该会看到类似如下的输出:

在 Debian 12 上使用 Nginx 和 Gunicorn 部署 Flask 应用

接下来,使用以下 systemctl 命令验证 Nginx 服务,以确保该服务已启用并正在运行。

sudo systemctl is-enabled nginx
sudo systemctl status nginx

输出中的 enabled 表示 Nginx 会在系统启动时自动启动。而状态 active (running) 表示 Nginx 正在运行。

在 Debian 12 上使用 Nginx 和 Gunicorn 部署 Flask 应用

最后,验证 supervisor 服务,以确保该服务已启用并正在运行。

sudo systemctl is-enabled supervisor
sudo systemctl status supervisor

你的终端上会显示类似的输出:

在 Debian 12 上使用 Nginx 和 Gunicorn 部署 Flask 应用

安装 Flask 和 Gunicorn

在接下来的步骤中,你将通过 pip 和 venv 虚拟环境安装 Flask。同时,你还将学习如何使用 Python 的 venv 模块创建和管理 Python 虚拟环境。

创建一个新的项目目录 ~/testapp,并通过 cd 命令进入该目录。

mkdir -p ~/testapp; cd ~/testapp

使用以下命令创建新的虚拟环境 venv。命令执行后将创建新的 venv 目录。

python -m venv venv

使用以下命令激活 venv 虚拟环境。激活后,你的 shell 提示符应变为类似 (venv) user@hostname.. 的形式。

source venv/bin/activate

在 Debian 12 上使用 Nginx 和 Gunicorn 部署 Flask 应用

激活 venv 后,执行以下 pip 命令安装 Flask 和 Gunicorn。

pip install flask gunicorn

安装开始后,你应该会看到以下输出:

在 Debian 12 上使用 Nginx 和 Gunicorn 部署 Flask 应用

如果你想要退出 venv 虚拟环境,可使用以下命令。

deactivate

使用 Flask 创建第一个应用

在虚拟环境中安装好 Flask 后,现在你将创建第一个 Flask 应用,它会向你展示一个简单的 HTML 页面。你还将学习如何运行和管理该 Flask 应用。

使用你习惯的编辑器创建新文件 testapp.py。以下示例使用 nano。

nano testapp.py

插入以下 Python 脚本来创建第一个 Flask 应用。以下代码将渲染默认 templates 目录中的 index.html 文件。

# testapp.py
from flask import Flask, render_template  # importing the render_template function
app = Flask(__name__)
# route to index page
@app.route("/")
def hello():
    return render_template('index.html')
if __name__ == ' __main__':
    app.run(debug=True)

完成后,保存并退出文件。

现在创建一个新的 templates 目录,并新建文件 index.html。

mkdir -p templates
nano templates/index.html

将以下 HTML 脚本插入到文件中。

<html>
    <body>
        <h1><center>Hello Flask - Nginx and Gunicorn Debian 12!</center></h1>
    </body>
</html>

保存文件并退出编辑器。

要测试你的应用,请在 shell 中像下面这样运行 testapp.py:

flask --app testapp run

在以下输出中,你应该会看到你的 Flask 应用运行在 localhost 的默认端口 5000 上。

在 Debian 12 上使用 Nginx 和 Gunicorn 部署 Flask 应用

打开另一个终端并连接到服务器,然后运行以下 curl 命令来验证你的 Flask 应用。

curl http://localhost:5000/

如果一切顺利,你应该会看到你所创建的 index.html 文件的源代码。

在 Debian 12 上使用 Nginx 和 Gunicorn 部署 Flask 应用

现在你可以按 Ctrl+c 终止你的 Flask 应用进程。

使用 wsgi 和 Gunicorn 运行 Flask 应用

在此步骤中,你将学习如何将 Flask 应用配置为通过 Gunicorn 运行。Gunicorn 是一个 Web 服务器网关接口(WSGI)HTTP 服务器,支持包括 Flask 在内的多种 Web 框架。

使用以下编辑器在与 testapp.py 相同的目录中创建新文件 wsgi.py。

nano wsgi.py

插入以下 Python 脚本,将你的 Flask 应用与 Gunicorn 集成。

# import testapp Flask application
from testapp import app
if __name__ == "__main__":
    app.run(debug=True)

完成后保存并退出文件。

为确保安装成功,运行以下 gunicorn 命令。这将通过 wsgi 脚本和 gunicorn 在端口 8080 上启动你的 Flask 应用。

gunicorn -w 4 --bind 0.0.0.0:8080 wsgi:app

如果成功,你应该会看到类似如下的输出:

在 Debian 12 上使用 Nginx 和 Gunicorn 部署 Flask 应用

现在打开你的 Web 浏览器,访问服务器 IP 地址加端口 8080,即:http://192.168.01.15:8080/。如果一切顺利,你应该会看到你所创建的 index.html 页面。

在 Debian 12 上使用 Nginx 和 Gunicorn 部署 Flask 应用

最后,按 Ctrl+c 终止 Gunicorn 进程。

使用 Supervisor 运行 Flask 应用

在配置好 Flask 与 Gunicorn 后,下一步你将把 Flask 应用与 Supervisor 集成。这样你就可以通过单一的命令行工具 supervisorctl 轻松管理 Flask 应用,supervisorctl 是 Supervisor 的命令行界面。

使用以下 nano 编辑器命令创建新的 Supervisor 配置文件 /etc/supervisor/conf.d/testapp.conf。

sudo nano /etc/supervisor/conf.d/testapp.conf

插入以下配置,并务必根据你的实际情况修改 user、Flask 安装目录路径以及应用名称。

[program:testapp] 
command=/bin/bash -c 'source /home/alice/testapp/venv/bin/activate; gunicorn -w 3 --bind unix:/home/alice/testapp/testapp.sock wsgi:app'
directory=/home/alice/testapp
user=alice
group=www-data
autostart=true 
autorestart=true 
stdout_logfile=/home/alice/testapp/testapp.log 
stderr_logfile=/home/alice/testapp/error.log

完成后保存并关闭文件。

接下来,运行以下 systemctl 命令重启 supervisor 服务以应用更改。然后,验证 supervisor 服务以确保其正在运行。

sudo systemctl restart supervisor
sudo systemctl status supervisor

以下输出表明 supervisor 服务正在运行。

在 Debian 12 上使用 Nginx 和 Gunicorn 部署 Flask 应用

最后,执行以下 supervisorctl 命令,以验证在 supervisor 管理下运行的进程列表。

sudo supervisorctl status

如果一切顺利,你应该会看到 testapp 在 supervisor 管理下运行,它通过 unix socket /home/alice/testapp/testapp.sock 运行。

在 Debian 12 上使用 Nginx 和 Gunicorn 部署 Flask 应用

你也可以使用以下命令验证该 UNIX socket /home/alice/testapp/testapp.sock。

ss -pl | grep testapp.sock

配置 Nginx 作为反向代理

至此,你的 Flask 应用已在 supervisor 的后台运行。为了让你的应用可被访问,你将配置反向代理,这里使用 Nginx。

使用以下 nano 编辑器命令创建新的 Nginx 服务器块配置文件 /etc/nginx/sites-available/testapp。

sudo nano /etc/nginx/sites-available/testapp

插入以下配置,并将 server_name 改为你的本地域名。

server {
    listen 80;
    server_name testapp.local;
    location / {
        include proxy_params;
        proxy_pass http://unix:/home/alice/testapp/testapp.sock;
    }
}

完成后保存文件并退出。

现在运行以下命令以启用服务器块配置 testapp。然后验证 Nginx 配置,以确保语法正确。

sudo ln -s /etc/nginx/sites-available/testapp /etc/nginx/sites-enabled/
sudo nginx -t

如果成功,你应该会看到输出 Syntax is OK - Test is successful。

在 Debian 12 上使用 Nginx 和 Gunicorn 部署 Flask 应用

最后,运行以下 systemctl 命令重启 Nginx 服务以应用更改。然后验证以确保服务正在运行。

sudo systemctl restart nginx
sudo systemctl status nginx

以下输出表明 Nginx 服务状态为正在运行。

在 Debian 12 上使用 Nginx 和 Gunicorn 部署 Flask 应用

访问 Flask 应用

如果你使用的是 Linux 客户端机器,请使用以下 nano 编辑器编辑 /etc/hosts 文件。

sudo nano /etc/hosts

像下面这样插入你的 Flask 应用域名和服务器 IP 地址:

192.168.10.15   testapp.local

完成后保存文件并退出编辑器。

现在打开你的 Web 浏览器,访问你的 Flask 应用域名 http://testapp.local/。如果一切顺利,你应该会看到你的 Flask 应用的 HTML 页面。

在 Debian 12 上使用 Nginx 和 Gunicorn 部署 Flask 应用

结语

作为本指南的收尾,你已完成在 Debian 12 上使用 Gunicorn 和 Nginx 安装 Flask 的工作。你还学习了如何创建和管理 Python 虚拟环境,并创建了第一个在 Supervisor 和 Nginx 反向代理后台运行的 Flask 应用。如需进一步学习,你可以尝试使用 MySQL/MariaDB、PostgreSQL 等关系型数据库(RDBMS)创建 Flask 应用。