使用uwsgi+nginx部署flask项目

在开发时,我们使用flask run命令启动的开发服务器是werkzeug提供的,但是这种方式目的是为了开发,不能很好的扩展,不适合生产部署。
生产部署时,我们需要一个更强健,性能更高的WSGI服务器(关于WSGI,可参考WSGI到底是什么 )

这里我是使用uWSGI + Nginx进行部署,系统为centos7。

创建虚拟环境

安装python虚拟环境包

1
pip install virtualenv

创建虚拟环境

1
virtualenv /root/.virtualenvs/flask_test

激活环境

1
source /root/.virtualenvs/flask_test/bin/activate

之后就可以正常pip安装需要的库

退出环境

1
deactivate

删除环境(直接删除虚拟环境文件夹)

1
rm -rf /root/.virtualenvs/flask_test

uWSGI

uWSGI 是一个软件应用程序,“旨在开发用于构建托管服务的完整堆栈”。它以 Web 服务器网关接口的名称命名,这是该项目支持的第一个插件。
uWSGI 通常用于与诸如 CherokeeNginx 之类的 Web 服务器一起为 Python Web 应用程序提供服务,后者直接支持 uWSGI 的本机 uwsgi 协议。

安装uwsgi

1
pip install uwsgi

在项目的目录创建一个uwsgi的配置文件uwsgi.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[uwsgi]
# socket方式与nginx连接,此参数需要对应nginx参数。即同步连接通道
socket = 127.0.0.1:5000

# 项目路径
chdir = /root/flask_test

wsgi-file = /root/flask_test/app.py
# flask特需的参数,指明app对象名称
callable = app

# 最大进程数,推荐匹配cpu数
processes = 4
# 每个进程开启的线程数
threads = 2
master = true

# 虚拟环境
home = /root/.virtualenvs/flask_test

# 退出时是否清理环境
vacuum = true

daemonize = /root/flask_test/uwsgi/uwsgi.log
status = /root/flask_test/uwsgi/uwsgi.status
pidfile = /root/flask_test/uwsgi/uwsgi.pad

使用配置文件运行

1
uwsgi --ini uwsgi.ini

停止和重启

一般会设置多个进程,那么可以在配置文件中添加 master 选项:

1
master = true

这样一来,除了配置中设置的进程数,还将另外启动一个 master 进程,用来管理其他进程。
这时,
再添加一个pidfile选项,使用pidfile来操作uwsgi

1
pidfile = /root/flask_test/uwsgi/uwsgi.pid

之后可以:

1
2
uwsgi --stop /root/flask_test/uwsgi/uwsgi.pid       #停止uwsgi
uwsgi --reload /root/flask_test/uwsgi/uwsgi.pid #重启uwsgi

配置nginx

一个简单的配置:

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name www.test.com;
charset utf-8;
access_log /root/flask_test/logs/access.log;
error_log /root/flask_test/logs/error.log;

location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass 127.0.0.1:5000;
}
}

可以将其命名为.conf的文件放到/etc/nginx/conf/目录下,方便管理。

之后重启 nginx 即可

文章作者: Dar1in9
文章链接: http://dar1in9s.github.io/2020/05/07/flask/使用uwsgi+nginx部署flask项目/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Dar1in9's Blog