本文记录了 Ubuntu 系统中,使用 Gunicorn 运行 Flask 应用的详细操作过程。
前言
在云服务器中使用 Python 直接运行 Flask 应用时,会出现以下提示:
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
当然了,出现该提示并不影响 Flask 应用的正常运行和使用。
但了解如何使用 WSGI 服务器运行 Flask 应用还是很有必要的。
本文 Linux 系统 : WSL2 , Ubuntu (全新安装)
操作步骤
本部分正式开始介绍如何在 Ubuntu 系统上以 Gunicorn 的方式运行 Flask 应用。
开始之前
进入正题之前,建议检查一下 Ubuntu 系统上是否具备本文所需的环境依赖。
- 首先执行以下命令更新 Ubuntu 的软件包列表
sudo apt update
- 执行以下命令确认 Python 版本(若 Python 版本低于 3.6 ,则建议安装更高版本):
python3 -V
- 执行以下命令确认 pip 版本:
pip3 -V
- 若提示
Command 'pip3' not found
信息,则执行以下命令安装 pip 软件包:sudo apt install python3-pip
- 执行以下命令确认 Ubuntu 系统中是否安装了 Python 的 venv 软件包
apt list --installed | grep python3-venv
- 如果没有安装Python 的 venv 软件包,则执行以下命令安装
sudo apt install python3-venv
运行程序
- 在 Linux 的用户目录中创建名为
pythonProject
的文件夹并进入该文件夹mkdir ~/pythonProject && cd ~/pythonProject
- 在 pythonProject 文件夹中创建一个新的 Python 虚拟环境
python3 -m venv ~/pythonProject/.venv
- 激活 pythonProject 文件夹中的 venv 虚拟环境
source ~/pythonProject/.venv/bin/activate
- 在激活后的 venv 虚拟环境中安装 flask 库和 gunicorn 库
pip install flask gunicorn
- 使用
vi
命令在 pythonProject 文件夹中创建并编辑app.py
文件vi ~/pythonProject/app.py
- 将以下代码块的内容复制粘贴至
~/pythonProject/app.py
文件中,保存后退出from flask import Flask app = Flask(__name__) @app.route('/', methods=['GET']) def hello_world(): return 'Hello World' if __name__ == '__main__': app.run('0.0.0.0', 5678)
- 使用 venv 虚拟环境的 gunicorn 库运行
app.py
中的 Flask 应用~/pythonProject/.venv/bin/gunicorn app:app
- 运行后会有
Listening at: http://127.0.0.1:8000 (3323)
的类似提示信息,浏览器访问其中的 URL 地址即可
扩展内容
以上为 gunicorn 的简单使用例子,实际中或许需要额外的 gunicorn 运行参数。
-w
参数 : 控制 Flask 应用运行的进程数- 例如运行 10 个 Flask 应用进程
gunicorn -w 10 app:app
- 例如运行 10 个 Flask 应用进程
-b
参数 : 控制 Flask 应用绑定的 IP 地址和端口号- 例如将 Flask 应用绑定在
192.168.1.100:8008
地址上gunicorn -b 192.168.1.100:8008 app:app
在云服务器上运行时,应绑定云服务器的内网 IP 地址或者
0.0.0.0
地址
- 例如将 Flask 应用绑定在
-D
参数 : 控制 gunicorn 在后台运行- 例如在后台运行 Flask 应用
gunicorn -w 10 -b 0.0.0.0:8210 -D app:app
后台运行时,需要使用
ps -ef | grep app
命令查找并终止 Flask 应用进程
- 例如在后台运行 Flask 应用
-h
参数 : 查看 gunicorn 的使用帮助gunicorn -h
app:app
参数 : 该参数为 Flask 应用的入口,实际对应py 文件名 : Flask 对象的变量名
- 例如 py 文件名为
main.py
而不是app.py
时gunicorn main:app
- 例如 py 文件名为
更多的 gunicorn 使用参数需要查阅帮助文档,此处不再列出。
总结
对于 gunicorn 的使用我也是浅尝辄止,当初只是为了在服务器上部署一个 API 用于项目。
文中大部分命令中都使用了绝对路径,正常情况下使用相对路径也是可以的。