如何在 Ubuntu 22.04 上安装带有 Nginx 和 Gunicorn 的 Flask
本教程适用于这些操作系统版本
- Ubuntu 22.04(Jammy Jellyfish)
- Ubuntu 20.04(Focal Fossa)
在此页
- 先决条件
- 设置新用户
- 安装依赖包
- 设置开发环境
- 在虚拟环境中安装 Python Flask
- 使用 Flask 创建第一个应用程序项目
- 设置 Gunicorn
- 使用 Gunicorn 和 Supervisor 运行 Flask 应用程序
- 将 Nginx 设置为 Flask 应用程序的反向代理
- 结论
Flask 是一个用 Python 编写的微框架,用于开发现代 Web 应用程序和 API(应用程序编程接口)。它基于 Werkzeug 工具包和 Jinja2 模板。 Flask 没有使用复杂的架构,而是一个小型的 Web 框架,易于扩展核心并且易于学习,因为 Flask 代码较少。 Flask 不包含 ORM,但仍然具有 URL 路由和模板引擎等很酷的功能。
Gunicorn 或“Green Unicorn”是一个具有 pre-fork worker 模式的 WSGI HTTP 服务器。它移植自 Rubys Unicorn 项目。 Gunicorn 可以与多个 Web 框架搭配使用,它对服务器资源轻量级且速度很快。 Gunicorn 位于您的应用程序和网络服务器之间,因此您可以将 Gunicorn 与网络服务器(例如 Nginx 和 Apache2)配对。
在这篇文章中,我们将向您展示如何在 Ubuntu 22.04 系统上使用 Gunicorn 和 Nginx 安装和配置 Python Flask Web 框架。本教程还介绍了如何使用 Gunicorn 和 Supervisord 设置 Python Flask。
先决条件
对于本指南,您需要满足以下先决条件:
- Ubuntu 22.04 系统 - 您可以使用 Ubuntu 22.04 桌面版或服务器版。
- 根用户 - 或非根用户。
设置新用户
在第一步中,您将为开发环境 Python Flask Web 框架设置一个新用户。如果您已经拥有具有 root/sudo 权限的非 root 用户,则可以跳过此步骤。该用户将用于运行 Python Flask 应用程序。
在此示例中,您将创建一个名为 \james\ 的新用户。运行以下命令创建新用户“james”,并为用户“james”设置密码。请务必使用强密码。
sudo useradd -m -s /bin/bash james
sudo passwd james
接下来,使用以下命令将用户 \james\ 添加到 \sudo\ 组。这将允许新用户 \james\ 运行 \sudo su\ 命令并获得 root 管理员权限。这是安装软件包和设置系统配置所必需的。
sudo usermod -aG sudo james
最后,通过以用户“james”登录并运行“sudo su”命令获取根权限来检查和验证新用户。输入用户 \james\ 的密码,您将获得 root shell。当前 shell 将从 \[email \ 更改。
su - james
sudo su

现在按 \Ctrl+d\ 或键入 \exit\ 返回到非根用户 \james\。
安装包依赖
现在您将为 Python Flask 安装安装一些包依赖项,这包括 \python3-pip\ 和 \python3-venv\。最后,您还将安装 Nginx Web 服务器和主管。
在开始安装包之前,请运行下面的 apt 命令来更新和刷新您的包存储库。
sudo apt update
现在使用以下命令安装 python3-pip 和 python3-venv。 python3-pip 将用作 Python 包的包管理器,python3-venv 将用于创建 Flask 应用程序开发的虚拟环境。
sudo apt install python3-pip python3-venv
输入 Y 确认安装,然后按 ENTER 继续。安装将开始。

安装完成后,运行以下命令在您的 Ubuntu 系统上设置默认的 Python。
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
现在验证 Python 和 Pip 的版本,并通过运行以下命令检查 Python venv 模块。在以下示例中,您将使用 Python 3.10 安装 Python Flask Web 框架。
python --version
pip --version
python -m venv -h

接下来,运行以下 apt 命令来安装 Nginx Web 服务器和主管程序包。 Nginx 网络服务器将用作 Python Flask 网络框架的默认网络服务器,主管将用于控制 Flask 应用程序,例如启动和停止 Flask 进程。
sudo apt install nginx supervisor
输入 Y 确认安装,然后按 ENTER 继续。等待包安装完成。

搭建开发环境
在本节中,您将创建一个新的 Python 虚拟环境,用作 Python Flask Web 框架的开发环境。
运行以下命令创建一个新的项目目录\/var/www/myapp\。该目录将用作 FLask 应用程序的主项目目录。
sudo mkdir -p /var/www/myapp
使用以下命令将新目录的所有权更改为用户 \james\ 并将权限更改为 \755\。
sudo chown -R james:james /var/www/myapp
sudo chmod 755 /var/www/myapp
移动到项目目录 \/var/www/myapp\ 并使用以下命令创建一个名为 \myenv\ 的新 Python 虚拟环境。
cd /var/www/myapp
python -m venv myenv
最后,使用以下命令激活虚拟环境\myenv\。激活后,您的 shell 提示符将变成类似 \(myenv) [email \。
source myenv/bin/activate

在虚拟环境中安装 Python Flask
设置虚拟环境后,您可以运行下面的 pip 命令在您的虚拟环境中安装 Python Flask 和 Gunicorn。所有这些包都将从 PyPi Python 存储库安装。
pip install flask gunicorn
现在开始安装。

使用 Flask 创建第一个 App 项目
您现在已经安装了 Python Flask Web 框架。现在您将使用 Flask 创建第一个应用程序。
在创建 Flask 项目之前,请确保您位于主项目目录 \/var/www/myapp\ 并且虚拟环境 \myenv\ 已激活.
使用 nano 编辑器创建一个新文件 \myapp.py\。
nano myapp.py
现在将以下 Python 脚本添加到文件中。
# myapp.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\ 并在\template\ 中创建一个新文件\index.html\ “ 目录。
mkdir -p templates/
nano templates/index.html
向其中添加以下 HTML 脚本。
<html>
<body>
<h1><center>Hello World!</center></h1>
</body>
</html>
完成后保存并关闭文件。
最后,运行脚本 \myapp.py\ 来运行您的第一个 Flask 应用程序。
python myapp.py
您将看到您的 Flask 项目正在默认的本地主机上运行,端口为 5000。

打开你的 Ubuntu 机器的新终端 shell 并运行下面的 curl 命令。
curl http://127.0.0.1:5000/
现在您可以在以下屏幕截图中看到 index.html 页面的输出。

要终止 Flask 应用程序进程,可以按“Ctrl+c”按钮。
设置 Gunicorn
Gunicorn 或“Green Unicorn”是 HTTP 服务器的 Python Web 服务器网关接口。它允许您将 Python 应用程序作为 HTTP 进程或使用 sock 文件运行。现在您将把 Gunicorn 添加到您的 Flask 项目中。
在 Flask 项目目录中,使用 nano 编辑器创建一个新文件 \wsgi.py\。
nano wsgi.py
向其中添加以下脚本。
# import myapp Flask application
from myapp import app
if __name__ == "__main__":
app.run(debug=True)
完成后保存并关闭文件。
接下来,运行以下命令以使用 Gunicorn 启动和运行 Flask 项目。在此示例中,您的 Flask 项目将在端口为 8000 的公共 IP 地址上运行。
gunicorn -w 4 --bind 0.0.0.0:8000 wsgi:app

打开您的网络浏览器并输入您的 Ubuntu 系统 IP 地址和端口 8000(即 http://192.168.5.28:8000/)。您应该会看到 Flask 项目的索引页。

现在按 \Ctrl+c\ 终止 Guncorn 进程。
使用 Gunicorn 和 Supervisor 运行 Flask 应用程序
现在您已经为 FLask 项目配置了 Gunicorn。是时候为 Flask Web 框架设置 Supervisor 了。
supervisor 是流程管理,它允许您在一个地方控制流程。因此,您将使用 Supervisor,而不是将 Flask 应用程序作为系统服务运行。
使用 nano 编辑器创建一个新的配置文件 \/etc/supervisor/conf.d/myapp.conf\。
sudo nano /etc/supervisor/conf.d/myapp.conf
将以下配置添加到文件中。并且一定要更改配置和用户的详细路径。
使用此配置,您将使用 Gunicorn 运行 Flask 项目,而不是使用应用程序的 IP 地址,您将像 sock 文件一样运行 Flask 项目。
[program:myapp]
command=/bin/bash -c 'source /var/www/myapp/myenv/bin/activate; gunicorn -w 3 --bind unix:/var/www/myapp/ipc.sock wsgi:app'
directory=/var/www/myapp
user=james
group=www-data
autostart=true
autorestart=true
stdout_logfile=/var/www/myapp/myapp.log
stderr_logfile=/var/www/myapp/error.log
完成后保存并关闭文件。
现在使用以下命令重新启动主管服务以应用新更改。
sudo systemctl restart supervisor
最后,使用以下命令检查并验证 Supervisor 下的进程列表。您应该看到 \myapp\ 进程正在运行。
sudo supervisorctl status
如果您检查主管服务,您将看到主管服务处于活动状态并正在运行。
sudo systemctl status supervisor

将 Nginx 设置为 Flask 应用程序的反向代理
使用 nano 编辑器创建一个新的虚拟主机配置\/etc/nginx/sites-available/myapp.conf\。
sudo nano /etc/nginx/sites-available/myapp.conf
将以下配置添加到文件中。在此示例中,Flask 项目将在本地域“www.myapp.local\”下运行。此外,您还可以看到“proxy_pass”选项指向在 Gunicorn 和 Supervisor 下运行的 UNIX sock 文件。
server {
listen 80;
server_name www.myapp.local;
location / {
include proxy_params;
proxy_pass http://unix:/var/www/myapp/ipc.sock;
}
}
完成后保存并关闭文件。
接下来,运行以下命令激活服务器块配置“myapp.conf”,然后验证 Nginx 配置。如果您没有收到任何错误,您将看到输出消息,例如“Syntax OK - test successful\”。
sudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/
sudo nginx -t
之后,您可以使用以下命令重新启动 Nginx 服务以将新更改应用于 Nginx 配置。
sudo systemctl restart nginx
现在在您的本地计算机上,使用 nano 编辑器编辑 /etc/hosts 文件。
sudo nano /etc/hosts
定义 Ubuntu 机器 IP 地址,域名为 \www.myapp.local\,如下所示。
192.168.5.28 www.myapp.local
保存并关闭文件。
现在打开您的网络浏览器并在地址栏中输入 Flask 项目域名(即 http://www.myapp.local)。你应该得到你的 Python Flask 项目的索引页。

结论
恭喜!您已经在 Ubuntu 22.04 机器上成功安装了带有 Gunicorn 和 Nginx 的 Python Flask Web 框架。您还学习了如何创建第一个 Python Flask 项目、设置 Python 虚拟环境以及为 Flask 项目设置 Supervisor 进程管理。