使用的uwsgi和nginx的 Flask 服务部署
本文仅展示 Flask使用uwsgi nginx部署的过程和过程中必要的介绍
快速上手
这是一个最简单的Flask项目
# filename:app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
运行方法
$ export FLASK_APP=app
# 需要先指定 app 文件 如果该文件名为 app.py 或 wsgi.py 可省略
$ flask run
1
2
3
2
3
默认部署在 127.0.0.1:5000
还可以在代码中指定端口和IP
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
if __name__=="__main__":
app.run(host="127.0.0.1",port=5000)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
运行
$ python app.py
1
将端口改为 0.0.0.0
即可外部访问 可作为简单部署方式但不推荐
uWSGI与nginx
WSGI:Web Server Gateway Interface 是一个Python标准PEP0333
uWSGI:一个C编写的应用服务器(全功能HTTP服务器) 可以直接构建网络服务 默认单核单线程
uwsgi:一种协议 uWSGI/nginx/apache httpd 都支持
部署
安装
pip install flask uwsgi
# uwsgi 需要gcc编译
sudo apt install nginx
# sudo yum install nginx
1
2
3
4
2
3
4
配置
uwsgi
uwsgi配置文件放在当前路径下 可命名为 uwsgi.ini
[uwsgi]
socket = 127.0.0.1:5000
# 启动程序时所使用的地址和端口
# 不过在服务器上是通过uwsgi设置端口 通过uwsgi来启动项目
# 也就是说启动了uwsgi 也就启动了项目
chdir = /path/to/your/project
# 切换目录/配置项目路径
wsgi-file = app.py
# flask程序的启动文件
# 通常在本地是通过运行 python app.py runserver 来启动项目的
callable = app
# 程序内启用的application变量名
processes = 1
# 处理器个数
threads = 2
# 线程个数
stats = 127.0.0.1:9191
# 获取uwsgi统计信息的服务地址
pidfile = uwsgi.pid
# 保存pid信息 方便停止服务和重启的时候用
daemonize = uwsgi.log
# 后台运行时记录uwsgi的运行日志
# 文件路径基于chdir路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
nginx
可以直接更改 /etc/nginx/sites-enabled/default
不然可能会发生服务覆盖
server{
listen 5000;
# port
location /{
include uwsgi_params;
# 引入uwsgi参数
uwsgi_pass 127.0.0.1:5000;
# 设置uwsgi地址
uwsgi_param UWSGI_CHDIR /path/to/your/project;
# 保持与之前的路径相同
uwsgi_param UWSGI_SCRIPT app:app;
# app_filename:callable
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
服务控制
uwsgi uwsgi.ini
uwsgi --ini uwsgi.ini
# 上述两种方式一样
uwsgi uwsgi.ini --daemonize
# 后台运行启动
uwsgi --stop uwsgi.pid
# 停止服务
uwsgi --reload uwsgi.pid
# 可以无缝重启服务
nginx
# 启动
nginx -s stop/quit
# 停止
nginx -s reload
# 热加载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17