用uWSGI和Nginx在Ubuntu 14.04上搭建Flask应用
背景 最近断断续续搞过一些小玩意,一般都是需要通过网络请求获取数据。自然而然的就想到了用Python来做,Python做服务端应用比较熟的就是Flask了。但是自己测试的时候用python命令行起一个简单的服务器很容易,但是想要做成稳定的服务器来调用还是要费些功夫的。本文就…
##背景 最近断断续续搞过一些小玩意,一般都是需要通过网络请求获取数据。自然而然的就想到了用Python来做,Python做服务端应用比较熟的就是Flask了。但是自己测试的时候用python命令行起一个简单的服务器很容易,但是想要做成稳定的服务器来调用还是要费些功夫的。本文就是记录一下用uWSGI和Nginx在Ubuntu 14.04上搭建Flask应用的流程。
##准备工作 首先当然要安装一下Python的基础环境和Nginx:
sudo apt-get update
sudo apt-get install python-pip python-dev nginx
安装了pip之后,我们就可以安装uwsgi和flask:
pip install uwsgi flask
##创建一个应用 现在就可以简单的创建一个Python应用:
vi ~/myproject/myproject.py
这里就直接贴一个简单的例子:
from flask import Flask
application = Flask(__name__)
@application.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
application.run(host='0.0.0.0')
写完之后可以先运行一下:
python myproject.py
如果一切正常的话,用浏览器打开127.0.0.1:5000就能看到“Hello World!“了。
原文图片托管服务已失效,图片暂未迁移。
##配置uWSGI
###创建wsgi.py
应用写好了就可以配置uWSGI了,首先创建一个wsgi.py文件:
vi ~/myproject/wsgi.py
在这个文件中就是简单的将我们之前创建的应用引入并执行:
from myproject import application
if __name__ == "__main__":
application.run()
创建好文件之后就可以运行uwsgi来试一下:
uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi
注意这里端口我们指定的是8000,所以用浏览器打开127.0.0.1:5000就能看到“Hello World!“了。
原文图片托管服务已失效,图片暂未迁移。
###创建uWSGI配置文件
下面要创建一个uWSGI配置文件:
vi ~/myproject/myproject.ini
在配置文件中我们指定一些配置参数,这样在运行usgi的时候就不需要写那么多参数了。简单的配置如下:
[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目录下:
sudo vi /etc/init/myproject.conf
然后我们编辑一下里面的内容:
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命令了
编写好之后运行:
sudo start myproject
##配置Nginx
Nginx的配置就比较简单了,首先在sites-available创建一个server文件用于指定我们的服务:
sudo vi /etc/nginx/sites-available/myproject
然后配置一下:
server {
listen 80;
server_name server_domain_or_IP;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/user/myproject/myproject.sock;
}
}
这里比较简单就不过多说明了。之后软链接到sites-enabled中:
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
然后检查一下我们的配置编写是否有问题:
sudo nginx -t
如果返回OK,那么我们就可以重启Ngnix来加载最新的配置了:
sudo service nginx restart
之后我们就可以通过Nginx配置的地址访问我们的服务了。
DONE!
参考: How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 14.04