用uWSGI和Nginx在Ubuntu 14.04上搭建Flask应用

##背景
最近断断续续搞过一些小玩意,一般都是需要通过网络请求获取数据。自然而然的就想到了用Python来做,Python做服务端应用比较熟的就是Flask了。但是自己测试的时候用python命令行起一个简单的服务器很容易,但是想要做成稳定的服务器来调用还是要费些功夫的。本文就是记录一下用uWSGI和Nginx在Ubuntu 14.04上搭建Flask应用的流程。

##准备工作
首先当然要安装一下Python的基础环境和Nginx:

1
2
sudo apt-get update
sudo apt-get install python-pip python-dev nginx

安装了pip之后,我们就可以安装uwsgi和flask:

1
pip install uwsgi flask

##创建一个应用
现在就可以简单的创建一个Python应用:

1
vi ~/myproject/myproject.py

这里就直接贴一个简单的例子:

1
2
3
4
5
6
7
8
9
from flask import Flask
application = Flask(__name__)

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

if __name__ == "__main__":
application.run(host='0.0.0.0')

写完之后可以先运行一下:

1
python myproject.py

如果一切正常的话,用浏览器打开127.0.0.1:5000就能看到”Hello World!”了。

##配置uWSGI

###创建wsgi.py

应用写好了就可以配置uWSGI了,首先创建一个wsgi.py文件:

1
vi ~/myproject/wsgi.py

在这个文件中就是简单的将我们之前创建的应用引入并执行:

1
2
3
4
from myproject import application

if __name__ == "__main__":
application.run()

创建好文件之后就可以运行uwsgi来试一下:

1
uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi

注意这里端口我们指定的是8000,所以用浏览器打开127.0.0.1:5000就能看到”Hello World!”了。

###创建uWSGI配置文件

下面要创建一个uWSGI配置文件:

1
vi ~/myproject/myproject.ini

在配置文件中我们指定一些配置参数,这样在运行usgi的时候就不需要写那么多参数了。简单的配置如下:

1
2
3
4
5
6
7
8
9
10
11
[uwsgi]
module = wsgi

master = true
processes = 5

socket = myproject.sock
chmod-socket = 660
vacuum = true

die-on-term = true

其中:
[uwsgi]是说明这个文件是针对uwsgi的配置,相当于说明文件类型。

module = wsgi是对应于之前创建的wsgi.py的文件。

master = true是说是使用master模式启动。

processes = 5这个是线程数5个。

socket = myproject.sock由于与客户端交互的是Nginx,所以uWSGI这里只是负责与Nginx通信,使用Unix socket方式进行通信是比较高效的方式。

chmod-socket = 660修改一下权限,让Nginx能够访问。

vacuum = true是说在进程结束时关闭socket。

die-on-term = true由于Upstart和uWSGI对于系统的SIGTERM信号处理不同,所以这里强制指定一下处理的逻辑。

###创建Upstart脚本文件
如果需要Ubuntu系统启动的时候就自动启动我们的应用,那么就要创建Upstart脚本文件。文件放在/etc/init目录下:

1
sudo vi /etc/init/myproject.conf

然后我们编辑一下里面的内容:

1
2
3
4
5
6
7
8
9
10
description "uWSGI server instance configured to serve myproject"

start on runlevel [2345]
stop on runlevel [!2345]

setuid user
setgid www-data

chdir /home/user/myproject
exec uwsgi --ini myproject.ini

其中:

description描述一下这个脚本的作用

start/stop on runlevel指明该脚本在什么情况下运行,一般的runlevel就是2, 3, 4, 5

setuid & setgid设置运行的uid和gid,其中Nginx运行时需要用户组为www-data

最后就是执行我们的uwsgi命令了

编写好之后运行:

1
sudo start myproject

##配置Nginx
Nginx的配置就比较简单了,首先在sites-available创建一个server文件用于指定我们的服务:

1
sudo vi /etc/nginx/sites-available/myproject

然后配置一下:

1
2
3
4
5
6
7
8
9
server {
listen 80;
server_name server_domain_or_IP;

location / {
include uwsgi_params;
uwsgi_pass unix:/home/user/myproject/myproject.sock;
}
}

这里比较简单就不过多说明了。之后软链接到sites-enabled中:

1
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

然后检查一下我们的配置编写是否有问题:

1
sudo nginx -t

如果返回OK,那么我们就可以重启Ngnix来加载最新的配置了:

1
sudo service nginx restart

之后我们就可以通过Nginx配置的地址访问我们的服务了。

DONE!

参考:
How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 14.04