使用 uWSGI 和 Nginx 部署 Flask 应用
Step 0: 准备工作
- 安装并配置 Nginx,可以参考这篇教程;
- 在 DNS 配置里加入一条 A 记录,将你的域名指向你的 IP,适用于子域名配置;
Step 1: 安装 Pip 包管理器
1 2 | $ sudo apt update $ sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools |
Setp 2: 创建 Python 虚拟环境
Python 虚拟环境有助于将不同的应用之间的 python 环境隔离;用于创建和管理虚拟环境的模块为 venv
1 | $ sudo apt install python3-venv |
创建项目目录并为其创建虚拟化环境
1 2 3 | $ mkdir ~/flask_demo $ cd ~/flask_demo $ python -m venv flaskenv |
激活上面创建的虚拟化环境
1 | $ source flaskenv/bin/activate |
Step 3: 创建 Flask 应用
安装 wheel 包,以支持 wheel(.whl) 打包格式
1 | (flaskenv) $ pip install wheel |
然后,再安装 Flask 和 uWSGI
1 | (flaskenv) $ pip install uwsgi flask |
创建 Flask Demo 应用
1 2 3 4 5 6 7 8 9 10 11 | # ~/flask_demo/app.py from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "<h1 style='color:blue'>Hello There!</h1>" if __name__ == "__main__": app.run(host='0.0.0.0') |
测试新创建的 Flask 应用
1 2 3 4 5 6 7 8 | (flaskenv) $ python app.py * Serving Flask app "app" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) |
通过浏览器访问 http://server-domain-or-ip:5000 将会看到页面
在控制台 CTRL-C 可以结束上面的 Server
创建 WSGI 网关
1 2 3 4 5 6 | # ~/flask_demo/wsgi.py from app import app if __name__ == "__main__": app.run() |
Step 4: 配置 uWSGI
直接使用 python app.py 运行服务的方式只适合本地开发,线上运行时要保证更高的性能和稳定性,需要使用 uwsgi 进行部署。
使用 uwsgi 部署 Flask 只需要换一种命令来启动服务即可
1 | (flaskenv) $ uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app |
- –socket 0.0.0.0:5000:指定暴露端口号为 5000
- –protocol=http:使用 http 协议
- -w wsgi:app:-w 指明了要启动的模块,wsgi 就是项目启动文件 wsgi.py 去掉扩展名,app 是 wsgi.py 文件中的变量 app,即 Flask 实例
启动完成后,在任意网络连通的机器上打开浏览器,并访问 http://server-domain-or-ip:5000 将再次看到同样结果
关掉控制台,并退出虚拟环境
1 | (flaskenv) $ deactivate |
创建 uWSGI配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 | # ~/flask_demo/app.ini [uwsgi] module = wsgi:app master = true processes = 5 socket = app.sock chmod-socket = 660 vacuum = true die-on-term = true |
Step 5: 创建 Systemd Service 配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # vim /etc/systemd/system/flask_demo.service [Unit] Description=uWSGI instance to serve flask_demo After=network.target [Service] User=joy Group=www-data WorkingDirectory=/home/joy/falsk_demo Environment="PATH=/home/joy/flask_demo/flaskenv/bin" ExecStart=/home/joy/flask_demo/flaskenv/bin/uwsgi --ini app.ini [Install] WantedBy=multi-user.target |
启动上面 uWSGI 服务,并让其开机自动启动
1 2 | $ sudo systemctl start flask_demo.service $ sudo systemctl enable flask_demo.service |
Step 6: 配置 Nginx,反向代理 uWSGI 请求
1 | $ sudo vim /etc/nginx/sites-available/flask_demo |
新创建一个 nginx server 配置项,通过 uwsgi_pass 将请求传递给我们在 app.ini 中配置文件指定创建的 socket
1 2 3 4 5 6 7 8 9 | server { listen 80; server_name your_domain www.your_domain; location / { include uwsgi_params; uwsgi_pass unix:/home/joy/flask_demo/app.sock; } } |
要启用该 server 配置,只要需要将其符号连接到 sites-enabled 目录:
1 | $ sudo ln -s /etc/nginx/sites-available/flask_demo /etc/nginx/sites-enabled |
检查新加的 nginx 配置文件是否有语法错误
1 | $ sudo nginx -t |
重启 nginx 服务项
1 | $ sudo systemctl restart nginx |
重启完成后,由于 Nginx 本身监听的端口是 80 端口,因此我们可以直接访问域名或者机器 IP 进行访问。
参考文章
How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 18.04