flask是个轻量级的网站框架,如果网站仅仅是几个简单的页面与功能接口的话,使用它比其他诸如django等框架要方便很多。然而当网站构建好后,需要部署到服务器,此时需要另外两个工具:用于让python与网站服务器相连的uwsgi,以及用于自动启动并守护的supervisor。

flask和uwsgi都支持python2和python3,但supervisor只支持python2,所以如果网站app一定要用python3的话则一定会出现他们装在不同的虚拟环境下。不过不怕,这是可以解决的。

笔者的网站app需要在anaconda3环境下(因为要用到很多科学库),虽然可以移植到python2,只是python3是趋势,anaconda也提供了太多的便利,所以就不折腾环境。

uwsgi与flask安装与配置

这两个我装在同一个环境下,命名为web

1
2
(web) $ pip install flask
(web) $ pip install uwsgi

假设anaconda的目录是/home/user/anaconda3那么python的位置应该是
/home/user/anaconda3/envs/web 这个很重要,因为不在这个环境下将没有
uwsgi也无法启动flask。
假设网站的目录是
1
2
3
4
5
6
7
8
9
/var/www/web/
|--static
| |--css
| |--js
|--manage.py
|--view.py
|--template
|--uwsgi.ini
|--supervisord.conf

显然uwsgi.ini和superviosrd.conf就是配置文件,后者在下章介绍。
uwsgi的配置如下
1
2
3
4
5
6
7
8
#uwsgi.ini
[uwsgi]
http = :8000
processes = 2
virtualenv = /home/user/anaconda3/envs/web
wsgi-file = /var/www/web/manage.py
callable = app
logto = /var/log/uwsgi/%n.log

如果使用logto要注意user用户是否有权利在/var/log/uwsgi下创建文件(包括文件夹是否存在)
更多uwsgi的配置可以看官方文档quick start以及Configuration

这里 callable 就是 manage.py 文件中的 flask 对象,一般我们用 app,参考flask官方deomo。

1
2
3
4
5
6
7
#manage.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
return "Hello World!"

supervisor 安装与配置

首先先看下supervisor如何配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#supervisord.conf

[inet_http_server]
port=127.0.0.1:9001

[program: web]
environment=pythonhome="/home/user/anaconda3/envs/web"
command=/home/user/anaconda3/envs/web/bin/uwsgi /var/www/web/uwsgi.ini
numprocs=1
stopsignal=TERM
autostart=true
autorestart=true

[supervisord]
[supervisorctl]
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

虽然设定了pythonhome这个环境变量,不过依然要些uwsgi的绝对路径,毕竟在
py2的环境下是没有uwsgi这个程序的。

安装supervisor需要切换到一个python2的环境,这里我依然是用anaconda添加虚拟环境

1
2
3
4
5
$conda create -n py2 python=2.7
$source activate py2
(py2) $pip install supervisor
(py2) $cd /var/www/web
(py2) $supervisord

最后一行命令就是执行supervisor,(注意有个d)

好了,这样就全部运行好了,可以用http://localhost:8000看是否出现了hello world。
如果需要做端口映射之类的,可以再用nginx之类,或者直接就把uwsgi改为80端口也可以。